CikaBika Bot: Discord RAT via Nim Loader and Edge DLL Sideload
Executive Summary
CikaBika Bot is a Rust-based remote access trojan that Darktrace malware researchers (Tara Gould) documented on 2026-10-14. The infection starts with a disk image, Proposition_Projet.img, holding a decoy PDF and a Windows shortcut disguised as a Word document. Opening the shortcut runs hidden PowerShell that decodes an executable embedded in the PDF, writes it to %TEMP%\IfyuUapz.txt and runs it. That file is a Nim loader carrying a Rust DLL and a PowerShell deployer. The deployer stages the DLL at C:\Windows\Temp\dbghelp.tmp, hijacks the per-user ms-settings shell open command and launches computerdefaults.exe so an auto-elevated command moves the DLL into the Microsoft Edge Application directory as dbghelp.dll, a DLL search-order hijack of Edge.
The RAT registers each victim with a dedicated Discord channel and takes operator commands there: shell execution, process listing, file upload and download, plus strings for screenshots, camera, streaming and broadcast. In the observed activity the operator zipped a directory and exfiltrated it with ngrok. Darktrace names no actor, no motive and no victim sector, and says the initial delivery method is unconfirmed. This pack does not supply any of those.
Detection strategy: Darktrace published four MD5 hashes and a handful of filenames but no network indicators, because Discord and ngrok are shared legitimate services. The durable detections are behavioral: the ms-settings registry hijack, a child of computerdefaults.exe, the dbghelp.tmp staging file, and a dbghelp.dll written beside msedge.exe. The DLL name is stock Windows, so every rule keys on path and writer, never on the name, and nothing here is a prevent action.
Source Review & Web Hunter Notes
One primary source supports this pack. A second and third source named in the tasking were fetched and checked, and neither is usable. A web search for independent coverage returned nothing that adds technical content. Every atomic indicator below therefore rests on a single origin and ships at detect, never prevent.
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| T1 | Darktrace: CikaBika Bot: Inside a Discord RAT (2026-10-14) | Full infection chain, Nim loader, ms-settings UAC bypass, Edge dbghelp.dll sideload, Discord C2 command set, ngrok exfiltration, four MD5 hashes, ATT&CK list (snapshot 01) | yes |
| n/a | Mallory malware page named in the tasking (019ead6f-e011-7560-9d27-07088c8e4def) | The page returned is a different malware family (MLTBackdoor, reported by another vendor). It contains no CikaBika content. Dropped, not cited, no snapshot | no |
| n/a | NetmanageIT blog index named in the tasking | Fetched the front page and searched it; no CikaBika post found. Dropped, not cited | no |
| n/a | Web search for independent CikaBika coverage | Only the Darktrace post and aggregator echoes of its abstract. No independent technical source found | no |
IfyuUapz.txt in places; this pack uses the IOC list as written, with the loader hash against IfyuUapz.txt and the RAT DLL hash against dbghelp.dll.Hunt Brief & Attack Chain
Hypotheses (ordered by fidelity)
- H1, high: a
dbghelp.dllis written besidemsedge.exein the Edge Application directory (T1574.001). Q10, with Q4 for the hash. - H2, high: the per-user ms-settings open command is written, and
computerdefaults.exespawns a child (T1548.002). Q6, Q7, Q8. - H3, high: a
dbghelp.tmpappears inC:\Windows\Temp(T1574.001, T1074.001). Q9. - H4, high: published lure, loader or hash artifacts exist on a host (T1204.002, T1036.007). Q2, Q4.
- H5, medium: an extension-disguised executable lands in Temp and a shortcut-launched PowerShell decodes it from a PDF (T1140, T1027.013). Q1, Q3.
- H6, low to medium: Discord and ngrok are contacted by processes that have no business with them (T1102.002, T1567). Q13, Q14, Q15. Weak by nature: shared infrastructure.
- H7, low: Edge or a Temp-resident parent runs recon utilities (T1057, T1016). Q11, Q12.
Attack chain
| Step | Phase | Behavior | Telemetry | Hunts |
|---|---|---|---|---|
| 1 | Delivery | Disk image Proposition_Projet.img with a shortcut named Proposition_Projet_Personnalisable.docx (LNK) and Presentation_Generale.pdf.pdf (delivery method unconfirmed) | Executable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | Q2, Q4 |
| 2 | Execution | Shortcut starts hidden PowerShell, shows the PDF decoy, decodes an embedded executable with an XOR key and writes %TEMP%\IfyuUapz.txt, run with cmd /c | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q1, Q2, Q3 |
| 3 | Loader | Nim loader decodes two Base64 blobs (Rust DLL and PowerShell deployer), runs the script hidden with an encoded command, tries loadLib then regsvr32.exe | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q5 |
| 4 | Staging | DLL copied to C:\Windows\Temp\dbghelp.tmp | Executable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | Q9 |
| 5 | UAC bypass | HKCU\Software\Classes\ms-settings\shell\open\command modified, computerdefaults.exe launched, elevated command moves the DLL | Registry value set (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents); Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q6, Q7, Q8 |
| 6 | Sideload | DLL placed at C:\Program Files (x86)\Microsoft\Edge\Application\dbghelp.dll for msedge.exe delay-load hijack (load not proven) | Executable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | Q10, Q11 |
| 7 | Recon | tasklist, ipconfig, screenshot; artifacts tasklist_startup.txt, network_info.txt, screenshot.png | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q12 |
| 8 | C2 | Registration and commands through a per-device Discord channel; public IP lookup through ipify.com | DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: no endpoint DNS table); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Q13 |
| 9 | Exfiltration | Directory zipped and sent with ngrok; !download returns files through Discord | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: no endpoint DNS table) | Q14, Q15 |
| 10 | Cleanup | Deployer deletes temporary scripts, intermediate DLL and registry changes | Not directly observable; the registry write (step 5) is the durable trace | Q6, Q7 |
Consolidated IOC Table
All atomic indicators below come from the Darktrace IOC list and text (snapshot 01). Hashes are MD5 as published; no SHA-256 was given. Filenames and paths are behavioral signatures, not importable IOCs.
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| md5 | 2deb724a709b0b892248405323350e9b | medium | detect | Nim loader, listed as IfyuUapz.txt (Darktrace) | 2027-04-15 |
| md5 | c66858718d883bcfb9ce2c19b59f96c9 | medium | detect | Rust RAT DLL, listed as dbghelp.dll (Darktrace). Single source, so detect only; the name is stock Windows | 2027-04-15 |
| md5 | 62e3e85eca78a0cd7e6669e9f33d936d | medium | detect | Shortcut Proposition_Projet_Personnalisable.docx.lnk (Darktrace) | 2027-04-15 |
| md5 | eeb52cb95113a131c2c7713c17872da6 | medium | detect | Decoy PDF with embedded payload Presentation_Generale.pdf.pdf (Darktrace) | 2027-04-15 |
| filename | Proposition_Projet.img | medium | hunt | Disk image container (Darktrace) | 2027-01-15 |
| filename | Proposition_Projet_Personnalisable.docx (.lnk) | medium | hunt | Shortcut disguised as a Word document | 2027-01-15 |
| filename | Presentation_Generale.pdf.pdf | medium | hunt | Double-extension decoy PDF | 2027-01-15 |
| filename | IfyuUapz.txt | medium | hunt | Loader written to %TEMP%; a PE disguised as text | 2027-01-15 |
| path | C:\Windows\Temp\dbghelp.tmp | medium | hunt | DLL staging file | 2027-01-15 |
| path | C:\Program Files (x86)\Microsoft\Edge\Application\dbghelp.dll | medium | hunt | Sideload target. Name is stock, location is the signal; never block by name | 2027-01-15 |
| registry | HKCU\Software\Classes\ms-settings\shell\open\command | high | hunt | UAC-bypass hijack key (technique shared with other campaigns) | 2027-01-15 |
| filename | tasklist_startup.txt, network_info.txt | low | enrich | RAT recon output files; screenshot.png is too generic to hunt alone | 2026-11-15 |
| service | ipify.com | low | enrich | Legitimate public-IP service queried by the RAT at registration. Never block | 2026-11-15 |
| network | none published | n/a | n/a | Darktrace published no Discord channel IDs, tokens, webhooks, ngrok endpoints, IPs or domains |
Affected Surface & Telemetry Matrix
| Surface | Telemetry | Priority | Gap |
|---|---|---|---|
| Windows endpoints where users can mount disk images and run shortcuts | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Executable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | High | Image mount events are outside the hunt queries; use the native audit hunts in section 7 |
| Local admins in default UAC mode (the bypass depends on the target's Windows configuration) | Registry value set (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents) | High | None for the registry write |
| Microsoft Edge install directory and msedge.exe | Executable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); module load events | High | DLL load into msedge.exe is outside the query set; use Sysmon image-load events (section 7) |
| Outbound Discord and ngrok traffic | DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: no endpoint DNS table); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Medium | Message content, channel IDs and tunnel endpoints are outside endpoint telemetry; TLS hides payloads |
| Documents on the desktop and user profile (collection and exfiltration) | File read and archive creation | Medium | File reads, screenshot capture and camera access are outside endpoint telemetry |
ATT&CK Mapping
Technique IDs are the ones Darktrace lists; the Query column is this pack's mapping.
| Tactic | Technique | Observed behavior | Query |
|---|---|---|---|
| Initial Access / Execution | T1204.002 User Execution: Malicious File | Opening the shortcut from the mounted image | Q1, Q2 |
| Defense Evasion | T1036.007 Double File Extension; T1036.005 Match Legitimate Name or Location | .pdf.pdf, .docx shortcut, dbghelp.dll in the Edge directory | Q2, Q10 |
| Execution | T1059.001 PowerShell; T1059.003 Windows Command Shell | Hidden PowerShell, cmd /c, encoded command from the loader | Q1, Q5, Q11 |
| Defense Evasion | T1027 Obfuscated Files; T1140 Deobfuscate/Decode; T1027.013 Encrypted/Encoded File | XOR-decoded payload in the PDF, Base64 blobs in the loader | Q1, Q3 |
| Privilege Escalation | T1548.002 Bypass User Account Control; T1112 Modify Registry | ms-settings open command and computerdefaults.exe | Q6, Q7, Q8 |
| Persistence / Defense Evasion | T1574.001 DLL Search Order Hijacking | dbghelp.dll beside msedge.exe | Q9, Q10, Q11 |
| Defense Evasion | T1218.010 Regsvr32; T1564.003 Hidden Window; T1070.004 File Deletion | Fallback load, hidden windows, cleanup of scripts and registry changes | Q5 (rest is a gap) |
| Discovery | T1082, T1016, T1057 | System, network and process discovery at RAT startup | Q12, Q11 |
| Collection | T1113 Screen Capture; T1005 Data from Local System; T1074.001 Local Data Staging; T1560.001 Archive via Utility | Screenshot, file download, staged ZIP | Gap (see section 15) |
| Command and Control | T1102.002 Web Service: Bidirectional Communication | Discord channel per device | Q13 |
| Exfiltration | T1567 Exfiltration Over Web Service; T1041 Exfiltration Over C2 Channel | ngrok and Discord file return | Q14, Q15 |
Native Audit-Log Hunts
Checks that do not need CQL. Event IDs below are standard Windows and Sysmon identifiers; confirm they are collected before relying on them.
- Sysmon Event 7 (image load):
msedge.exeloadingdbghelp.dllfrom its own Application directory instead of System32, especially when unsigned. This closes the main gap the CQL set cannot see. - Sysmon Event 11 (file create) and Event 13 (registry value set):
dbghelp.tmpin Windows\Temp; writes under\Software\Classes\ms-settings\shell\open\command. - Security 4688 with command line and PowerShell 4104 script block logs: PowerShell reading a PDF as bytes, XOR operations, Base64 decode, and Add-Type compiling a small C# helper that calls ShowWindow (Darktrace describes this helper).
- Disk image mounts: the Windows virtual-disk operational log records image attach events on most builds; confirm the exact log and IDs on your build and look for .img or .iso files mounted from Downloads or mail cache followed by a shortcut launch from the new drive letter.
- Proxy and DNS logs: Discord API hosts and ngrok service names from hosts that never use them; a short burst of both from one host.
- File-system sweep: look for a
dbghelp.dlldirectly in the Edge Application folder, adbghelp.tmpin Windows\Temp, and anIfyuUapz.txtin user Temp folders (the read-only audit script in section 13 does this).
Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL
Use your tenant's own address. SentinelOne does not document a link that pre-fills a query, so each "Copy & open SentinelOne" button copies the query and opens this console: paste it into PowerQuery.
Pick your portal. Microsoft documents a Share link in advanced hunting but not its URL format, so each "Copy & open Defender" button copies the query and opens Advanced hunting: paste it into the editor.
Looks for: PowerShell whose command line references a .pdf and a byte-read or XOR operation, the decoy-plus-payload step Darktrace describes (PDF read as bytes, XOR key, executable written to a temp file). Darktrace shows the command only as a screenshot, so the exact tokens below are a hypothesis, not a published string.
Known limitations and deployment notes
- PowerQuery: A script that reads the PDF through a file path built at run time and never shows .pdf on the command line is not captured.
- PowerQuery assumes: On Process Creation, tgt.process.* is the new process and src.process.* is its creator, so the CQL's parent field maps to src.process.name.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- PowerQuery assumes: src.process.user is the creator's user, which is the user who ran the shortcut.
- KQL – Defender XDR: A script that builds the PDF path at run time and never shows .pdf on the command line is not captured.
- KQL – Defender XDR assumes: matches regex with the (?i) prefix reproduces the CQL /i flag.
- KQL – Defender XDR assumes: FileName holds the created process name.
// HUNT: PowerShell Reading a PDF as Bytes and XOR-Decoding an Embedded Executable // MITRE: T1204.002, T1059.001, T1140, T1027.013 // CONF: medium FP: low COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: PDF-processing admin scripts that read bytes are rare; legitimate use almost never pairs a PDF path with a bitwise XOR // LOOKBACK: 7d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^powershell(\.exe)?$/i | CommandLine=/\.pdf/i | CommandLine=/(ReadAllBytes|-bxor|AsByteStream|Encoding\s+Byte)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.user: Useragent.uuid: Endpoint identifier
Readiness test
event.type = 'Process Creation' tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: PowerShell Reading a PDF as Bytes and XOR-Decoding an Embedded Executable // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1204.002, T1059.001, T1140, T1027.013 // CONF: medium | FP: low // FALSE POSITIVES: PDF-processing admin scripts that read bytes are rare; legitimate use almost never pairs a PDF path with a bitwise XOR // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: PowerShell by name, a .pdf in the command line, and one of the byte-read or XOR markers. Lineage re-mapped for SentinelOne. // REQUIRES: SentinelOne Process Creation telemetry with command lines // TUNING: PDF-processing admin scripts are rare; exclude a reviewed script by its full command line. // LOOKBACK: 7d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A script that reads the PDF through a file path built at run time and never shows .pdf on the command line is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' tgt.process.name matches '^powershell(\\.exe)?$' tgt.process.cmdline contains '.pdf' tgt.process.cmdline matches '(ReadAllBytes|-bxor|AsByteStream|Encoding\\s+Byte)' | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: TimestampFileName: FileNameProcessCommandLine: ProcessCommandLine
Recommended fields
InitiatingProcessFileName: InitiatingProcessFileName
Optional fields
SHA1: Hash. SHA256 is often unpopulated in this table.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, ProcessCommandLine | take 5
// HUNT: PowerShell Reading a PDF as Bytes and XOR-Decoding an Embedded Executable // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1204.002, T1059.001, T1140, T1027.013 // CONF: medium | FP: low // FALSE POSITIVES: PDF-processing admin scripts that read bytes are rare; legitimate use almost never pairs a PDF path with a bitwise XOR // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: PowerShell by name, a .pdf in the command line, and one of the byte-read or XOR markers. The parent is InitiatingProcessFileName. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: PDF-processing admin scripts are rare; exclude a reviewed script by its full command line. // LOOKBACK: 7d; extend to 30d for the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A script that builds the PDF path at run time and never shows .pdf on the command line is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(7d) | where FileName matches regex @"(?i)^powershell(\.exe)?$" | where ProcessCommandLine contains ".pdf" | where ProcessCommandLine matches regex @"(?i)(ReadAllBytes|-bxor|AsByteStream|Encoding\s+Byte)" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine | sort by Timestamp desc | take 200
Looks for: The filenames Darktrace published (image, double-extension PDF, shortcut, Nim loader) in any process command line, parent name or file write.
Known limitations and deployment notes
- PowerQuery: A lure name that exists only inside an archive or in a field the agent does not record is not captured.
- PowerQuery assumes: File Creation covers every file type, not only PE images, so the file-path half may fire on a harmless document with a lure name.
- PowerQuery assumes: contains is used so the names stay verbatim; Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: The written-file half of the CQL (a lure file written but never executed) is not covered; run a DeviceFileEvents search on FileName for the same three names.
- KQL – Defender XDR assumes: contains is case-insensitive, which reproduces the CQL /i flag.
// HUNT: Published CikaBika Lure and Loader Filenames // MITRE: T1204.002, T1036.007, T1036.005 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2, PeFileWritten, NewExecutableWritten // FALSE POSITIVES: none expected for IfyuUapz; the Proposition_Projet and Presentation_Generale strings are generic French business wording, so a hit on those alone needs a look at the file type and path // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | CommandLine=/(IfyuUapz|Proposition_Projet|Presentation_Generale)/i or FileName=/IfyuUapz/i or ParentBaseFileName=/IfyuUapz/i or TargetFileName=/(IfyuUapz|Proposition_Projet|Presentation_Generale)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, TargetFileName, MD5HashData, SHA256HashData])
7 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command linetgt.file.path: Written file path
Recommended fields
src.process.user: Usertgt.file.md5: Written file MD5tgt.file.sha256: tgt.file.sha256
Readiness test
event.type = 'Process Creation' tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.file.path
// HUNT: Published CikaBika Lure and Loader Filenames
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.002, T1036.007, T1036.005
// CONF: high | FP: low
// FALSE POSITIVES: none expected for IfyuUapz; the Proposition_Projet and Presentation_Generale strings are generic French business wording, so a hit on those alone needs a look at the file type and path
// EQUIVALENCE: equivalent-with-schema-assumptions - Same name test on command lines, created and creating process names, and (PE writes mapped to File Creation) written file paths. Only the loader name is tested against process names, as in the CQL.
// REQUIRES: SentinelOne Process Creation and File Creation telemetry
// TUNING: A hit on Proposition_Projet or Presentation_Generale alone is generic French business wording: check the file type and path before escalating.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: A lure name that exists only inside an archive or in a field the agent does not record is not captured.
// VALIDATION LEVEL: static-reviewed
(event.type = 'Process Creation' (tgt.process.cmdline contains ('IfyuUapz','Proposition_Projet','Presentation_Generale') or tgt.process.name contains 'IfyuUapz' or src.process.name contains 'IfyuUapz')) or (event.type = 'File Creation' tgt.file.path contains ('IfyuUapz','Proposition_Projet','Presentation_Generale'))
| columns event.type, event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.file.path, tgt.file.md5, tgt.file.sha256, agent.uuid
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: TimestampFileName: FileNameProcessCommandLine: ProcessCommandLineFolderPath: FolderPath
Recommended fields
InitiatingProcessFileName: InitiatingProcessFileName
Optional fields
MD5: Hash. SHA256 is often unpopulated in this table.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, ProcessCommandLine, FolderPath | take 5
// HUNT: Published CikaBika Lure and Loader Filenames // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1204.002, T1036.007, T1036.005 // CONF: high | FP: low // FALSE POSITIVES: none expected for IfyuUapz; the Proposition_Projet and Presentation_Generale strings are generic French business wording, so a hit on those alone needs a look at the file type and path // EQUIVALENCE: telemetry-gap - Partial pivot: DeviceProcessEvents covers the lure names on a created process (command line, name, path, creator), not the written-file half the CQL also tests. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: A hit on Proposition_Projet or Presentation_Generale alone is generic French business wording: check the file type and path before escalating. // LOOKBACK: 30d; extend only within Advanced Hunting retention // CONFIGURATION: No lookup objects required. // KNOWN GAPS: The written-file half of the CQL (a lure file written but never executed) is not covered; run a DeviceFileEvents search on FileName for the same three names. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where ProcessCommandLine contains "IfyuUapz" or ProcessCommandLine contains "Proposition_Projet" or ProcessCommandLine contains "Presentation_Generale" or FileName contains "IfyuUapz" or FolderPath contains "IfyuUapz" or InitiatingProcessFileName contains "IfyuUapz" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine, SHA1, MD5 | sort by Timestamp desc | take 200
Looks for: A PE image written under a Temp folder with a .txt, .pdf, .png, .jpg or .log extension. The Nim loader arrives as %TEMP%\IfyuUapz.txt; the extension is the disguise and is hash-independent. FP: installer staging; exclude the deployment agent after a baseline (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: A file's real type (PE image) is not visible in the attested field model, so the disguised-extension test cannot be made precise.
- KQL – Defender XDR: A file's real type (PE image) is not visible in DeviceFileEvents, so the disguised-extension test cannot be made precise.
// HUNT: PE Image Written to Temp With a Non-Executable Extension // MITRE: T1036.005, T1027, T1140 // CONF: medium FP: medium COST: low // REQUIRES: PeFileWritten, NewExecutableWritten // FALSE POSITIVES: installers and self-extractors occasionally stage binaries with odd extensions in Temp // TUNING: exclude the writing process for your software-deployment agent and known installer parents after a 30-day baseline; an extension-disguised PE written by powershell.exe, cmd.exe or a user-profile process is the high-confidence tier // LOOKBACK: 7d #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\(AppData\\Local\\Temp|Windows\\Temp)\\[^\\]+\.(txt|pdf|png|jpg|log)$/i | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, TargetFileName, MD5HashData, SHA256HashData])
1 required field · View requirements
Required telemetry
- File Creation
Required fields
event.type: Event type
Readiness test
event.type = 'File Creation' | limit 5 | columns event.type
// HUNT: PE Image Written to Temp With a Non-Executable Extension // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1036.005, T1027, T1140 // CONF: medium | FP: medium // FALSE POSITIVES: installers and self-extractors occasionally stage binaries with odd extensions in Temp // EQUIVALENCE: unsupported-without-redesign - A PE image written under a document or text extension cannot be told from any other file in a SentinelOne File Creation event: there is no attested PE-type field, so the extension test alone would match every log and text file in Temp. // REQUIRES: A file-type or PE-header field on File Creation events // TUNING: Use the CQL tab, or hunt Q9 and Q10 for the specific staging files. // LOOKBACK: 7d on the CQL tab // CONFIGURATION: Use the CQL tab for this card. // KNOWN GAPS: A file's real type (PE image) is not visible in the attested field model, so the disguised-extension test cannot be made precise. // VALIDATION LEVEL: static-reviewed
1 required field · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event time
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp | take 5
// HUNT: PE Image Written to Temp With a Non-Executable Extension // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1036.005, T1027, T1140 // CONF: medium | FP: medium // FALSE POSITIVES: installers and self-extractors occasionally stage binaries with odd extensions in Temp // EQUIVALENCE: unsupported-without-redesign - DeviceFileEvents has no PE-type column, so an executable written under a document or text extension cannot be separated from ordinary logs and documents in Temp. // REQUIRES: A PE-type column on file write events // TUNING: Use the CQL tab, or hunt Q9 and Q10 for the specific staging files. // LOOKBACK: 7d on the CQL tab // CONFIGURATION: Use the CQL tab for this card. // KNOWN GAPS: A file's real type (PE image) is not visible in DeviceFileEvents, so the disguised-extension test cannot be made precise. // VALIDATION LEVEL: static-reviewed
Looks for: The four MD5 values Darktrace published, matched against process starts and PE writes. The shortcut and PDF hashes are included for completeness but only the loader and the DLL are PE files that these events can carry.
Known limitations and deployment notes
- PowerQuery: A rebuilt payload with a different MD5 is not captured.
- PowerQuery: The values come from one vendor report and may not be re-observed.
- PowerQuery assumes: MD5 population on tgt.process.image.md5 and tgt.file.md5 varies by tenant; run the readiness test.
- PowerQuery assumes: File Creation covers every file type, not only PE images.
- KQL – Defender XDR: Advanced Hunting keeps 30 days; the CQL tab covers 90d, so older writes are only on the CQL tab.
- KQL – Defender XDR: A process image that was never written inside the window is not covered; search DeviceProcessEvents on MD5 for the same four values.
- KQL – Defender XDR assumes: MD5 is populated on DeviceFileEvents for written files on most tenants; run the readiness test to confirm.
- KQL – Defender XDR assumes: in~ is case-insensitive, which reproduces the CQL /i flag.
// HUNT: Published CikaBika MD5 Hashes // MITRE: T1204.002, T1027, T1574.001 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2, PeFileWritten, NewExecutableWritten // FALSE POSITIVES: none expected. Single-source (Darktrace) hashes of campaign-specific files // LOOKBACK: 90d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | MD5HashData=/^(2deb724a709b0b892248405323350e9b|c66858718d883bcfb9ce2c19b59f96c9|62e3e85eca78a0cd7e6669e9f33d936d|eeb52cb95113a131c2c7713c17872da6)$/i | table([@timestamp, aid, ComputerName, UserName, FileName, TargetFileName, MD5HashData, SHA256HashData])
5 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nametgt.process.image.md5: Created image MD5tgt.file.md5: Written file MD5
Recommended fields
src.process.user: Usertgt.process.name: Created process nametgt.file.path: Written file path
Readiness test
event.type = 'Process Creation' tgt.process.image.md5 = * | limit 5 | columns event.type, event.time, endpoint.name, tgt.process.image.md5, tgt.file.md5
// HUNT: Published CikaBika MD5 Hashes
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.002, T1027, T1574.001
// CONF: high | FP: low
// FALSE POSITIVES: none expected. Single-source (Darktrace) hashes of campaign-specific files
// EQUIVALENCE: equivalent-with-schema-assumptions - Same four published MD5 values tested on the created image of a process and on the written file. in:anycase reproduces the CQL /i flag.
// REQUIRES: SentinelOne Process Creation and File Creation events with MD5 populated
// TUNING: Hashes change on rebuild; treat a miss as no evidence. The values are single-sourced.
// LOOKBACK: 90d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: A rebuilt payload with a different MD5 is not captured. The values come from one vendor report and may not be re-observed.
// VALIDATION LEVEL: static-reviewed
(event.type = 'Process Creation' tgt.process.image.md5 in:anycase ('2deb724a709b0b892248405323350e9b','c66858718d883bcfb9ce2c19b59f96c9','62e3e85eca78a0cd7e6669e9f33d936d','eeb52cb95113a131c2c7713c17872da6')) or (event.type = 'File Creation' tgt.file.md5 in:anycase ('2deb724a709b0b892248405323350e9b','c66858718d883bcfb9ce2c19b59f96c9','62e3e85eca78a0cd7e6669e9f33d936d','eeb52cb95113a131c2c7713c17872da6'))
| columns event.type, event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.image.md5, tgt.file.path, tgt.file.md5, tgt.file.sha256, agent.uuid
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: TimestampMD5: MD5FileName: FileNameFolderPath: FolderPath
Recommended fields
InitiatingProcessFileName: InitiatingProcessFileName
Optional fields
SHA1: Hash. SHA256 is often unpopulated; MD5 is the published value.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, MD5, FileName, FolderPath | take 5
// HUNT: Published CikaBika MD5 Hashes
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1204.002, T1027, T1574.001
// CONF: high | FP: low
// FALSE POSITIVES: none expected. Single-source (Darktrace) hashes of campaign-specific files
// EQUIVALENCE: telemetry-gap - Partial pivot: the four published MD5 values are tested on files written (DeviceFileEvents). The execution half the CQL also tests, a process image with the same MD5, is not covered.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents)
// TUNING: Hashes change on rebuild; treat a miss as no evidence. The values are single-sourced.
// LOOKBACK: 30d (Advanced Hunting retention; the CQL tab covers 90d)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Advanced Hunting keeps 30 days; the CQL tab covers 90d, so older writes are only on the CQL tab. A process image that was never written inside the window is not covered; search DeviceProcessEvents on MD5 for the same four values.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where MD5 in~ ("2deb724a709b0b892248405323350e9b", "c66858718d883bcfb9ce2c19b59f96c9", "62e3e85eca78a0cd7e6669e9f33d936d", "eeb52cb95113a131c2c7713c17872da6")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, FileName, FolderPath, MD5, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: Darktrace says the Nim loader falls back to regsvr32.exe if loadLib fails. Matches regsvr32 pointed at a Temp, ProgramData or Public path. Low confidence: the exact command line is not published. FP: installer registration; exclude msiexec and the deployment agent (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: A DLL registered by a process the agent did not observe starting is not captured.
- PowerQuery assumes: On Process Creation, tgt.process.* is the new process and src.process.* is its creator, so the CQL's parent field maps to src.process.name.
- PowerQuery assumes: Backslashes in the path regex are double-escaped as PowerQuery requires.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: A DLL registered by a process the sensor did not observe starting is not captured.
- KQL – Defender XDR assumes: contains is case-insensitive, which reproduces the CQL /i flag.
- KQL – Defender XDR assumes: Each path is matched with a trailing backslash so the folder, not a file name, is tested.
// HUNT: regsvr32 Registering a DLL From Temp, ProgramData or Public // MITRE: T1218.010, T1574.001 // CONF: low FP: medium COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: installers and legacy line-of-business software register DLLs from Temp during setup // TUNING: exclude msiexec.exe and your deployment agent as ParentBaseFileName; prioritise hits whose parent is a Temp-resident or user-profile binary // LOOKBACK: 7d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^regsvr32(\.exe)?$/i | CommandLine=/\\(AppData\\Local\\Temp|Windows\\Temp|ProgramData|Users\\Public)\\/i | ParentBaseFileName!=/^msiexec\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.user: Useragent.uuid: Endpoint identifier
Readiness test
event.type = 'Process Creation' tgt.process.cmdline = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: regsvr32 Registering a DLL From Temp, ProgramData or Public // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1218.010, T1574.001 // CONF: low | FP: medium // FALSE POSITIVES: installers and legacy line-of-business software register DLLs from Temp during setup // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: regsvr32 by name, a command line naming Temp, ProgramData or Users\Public, and a creator that is not msiexec. Lineage re-mapped for SentinelOne. // REQUIRES: SentinelOne Process Creation telemetry with command lines // TUNING: Exclude msiexec and your deployment agent as the creator (src.process.name); prioritise hits whose creator is a Temp-resident or user-profile binary. // LOOKBACK: 7d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A DLL registered by a process the agent did not observe starting is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' tgt.process.name matches '^regsvr32(\\.exe)?$' tgt.process.cmdline matches '\\\\(AppData\\\\Local\\\\Temp|Windows\\\\Temp|ProgramData|Users\\\\Public)\\\\' !(src.process.name matches '^msiexec\\.exe$') | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, agent.uuid | limit 200
Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: TimestampFileName: FileNameProcessCommandLine: ProcessCommandLineInitiatingProcessFileName: InitiatingProcessFileName
Optional fields
SHA1: Hash. SHA256 is often unpopulated in this table.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, ProcessCommandLine, InitiatingProcessFileName | take 5
// HUNT: regsvr32 Registering a DLL From Temp, ProgramData or Public // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1218.010, T1574.001 // CONF: low | FP: medium // FALSE POSITIVES: installers and legacy line-of-business software register DLLs from Temp during setup // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: regsvr32 by name, a command line naming Temp, ProgramData or Users\Public, and a creator that is not msiexec. The creator is InitiatingProcessFileName. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: Exclude msiexec and your deployment agent as the initiating process; prioritise hits whose parent is a Temp-resident or user-profile binary. // LOOKBACK: 7d; extend to 30d for the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A DLL registered by a process the sensor did not observe starting is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(7d) | where FileName matches regex @"(?i)^regsvr32(\.exe)?$" | where ProcessCommandLine contains "\\AppData\\Local\\Temp\\" or ProcessCommandLine contains "\\Windows\\Temp\\" or ProcessCommandLine contains "\\ProgramData\\" or ProcessCommandLine contains "\\Users\\Public\\" | where InitiatingProcessFileName !~ "msiexec.exe" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine | sort by Timestamp desc | take 200
Looks for: Any write to the per-user ms-settings shell open command key, the hijack Darktrace describes before computerdefaults.exe is launched. This is the technique, shared with other campaigns, so it is a behavioral hunt rather than a CikaBika-only signal. FP: authorised pen-test tooling; exclude test hosts by aid (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: A registry write made through a path the agent does not record is not captured.
- PowerQuery assumes: registry.keyPath carries the hive prefix the agent records (HKU or HKCU style); the test matches the tail of the key so the prefix does not matter.
- PowerQuery assumes: A key created without a value write is not a value-modified event.
- PowerQuery assumes: On registry events the acting process is src.process.*.
- KQL – Defender XDR: A key created without a value write is not covered.
- KQL – Defender XDR assumes: RegistryValueSet is the ActionType for a value write; it is attested in Microsoft-owned hunting repositories but not enumerated on Microsoft Learn.
- KQL – Defender XDR assumes: contains is case-insensitive, which reproduces the CQL /i flag.
// HUNT: HKCU ms-settings Shell Open Command Hijack // MITRE: T1548.002, T1112 // CONF: high FP: medium COST: low // REQUIRES: AsepValueUpdate, RegGenericValueUpdate // FALSE POSITIVES: very few legitimate products write this key; red-team and pen-test tooling does // TUNING: exclude authorised test hosts by aid; any write whose RegStringValue points to a Temp, ProgramData or cmd/powershell command is the high-confidence tier // LOOKBACK: 30d #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate)$/ | RegObjectName=/\\ms-settings\\shell\\open\\command/i | table([@timestamp, aid, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue, ContextBaseFileName])
4 required fields · View requirements
Required telemetry
- Registry Value Modified
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nameregistry.keyPath: Registry key path
Recommended fields
src.process.name: Creator or acting processregistry.valueName: registry.valueNameregistry.value: Registry value datasrc.process.user: User
Readiness test
event.type = 'Registry Value Modified' registry.keyPath = * | limit 5 | columns event.type, event.time, endpoint.name, registry.keyPath
// HUNT: HKCU ms-settings Shell Open Command Hijack // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1548.002, T1112 // CONF: high | FP: medium // FALSE POSITIVES: very few legitimate products write this key; red-team and pen-test tooling does // EQUIVALENCE: equivalent-with-schema-assumptions - Same key-path test for the ms-settings shell open command on registry value writes. The acting process is src.process.* on registry events. // REQUIRES: SentinelOne Registry Value Modified telemetry // TUNING: Exclude authorised test hosts by agent.uuid; any write whose registry.value points to a Temp, ProgramData or shell command is the high-confidence tier. // LOOKBACK: 30d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A registry write made through a path the agent does not record is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Registry Value Modified' registry.keyPath contains '\\ms-settings\\shell\\open\\command' | columns event.time, endpoint.name, src.process.user, registry.keyPath, registry.valueName, registry.value, src.process.name, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceRegistryEvents
Required fields
Timestamp: TimestampActionType: ActionTypeRegistryKey: RegistryKey
Recommended fields
RegistryValueName: RegistryValueNameRegistryValueData: RegistryValueDataInitiatingProcessFileName: InitiatingProcessFileName
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceRegistryEvents | where Timestamp > ago(1d) | where ActionType == "RegistryValueSet" | project Timestamp, ActionType, RegistryKey | take 5
// HUNT: HKCU ms-settings Shell Open Command Hijack // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1548.002, T1112 // CONF: high | FP: medium // FALSE POSITIVES: very few legitimate products write this key; red-team and pen-test tooling does // EQUIVALENCE: equivalent-with-schema-assumptions - Same key-path test for the ms-settings shell open command on registry value writes (RegistryValueSet). // REQUIRES: Defender for Endpoint registry telemetry (DeviceRegistryEvents) // TUNING: Exclude authorised test hosts by DeviceId; any write whose RegistryValueData points to a Temp, ProgramData or shell command is the high-confidence tier. // LOOKBACK: 30d; extend only within Advanced Hunting retention // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A key created without a value write is not covered. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceRegistryEvents | where Timestamp >= ago(30d) | where ActionType == "RegistryValueSet" | where RegistryKey contains "\\ms-settings\\shell\\open\\command" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, RegistryKey, RegistryValueName, RegistryValueData, InitiatingProcessFileName | sort by Timestamp desc | take 200
Looks for: The same registry key, narrowed to values that mention dbghelp or the Edge Application directory, the CikaBika-specific move of the staged DLL.
Known limitations and deployment notes
- PowerQuery: A command that moves the file through a different name or an environment variable is not captured.
- PowerQuery assumes: On registry events the acting process is src.process.*.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: A command that moves the file through a different name or an environment variable is not captured.
- KQL – Defender XDR assumes: RegistryValueSet is the ActionType for a value write; it is attested in Microsoft-owned hunting repositories but not enumerated on Microsoft Learn.
- KQL – Defender XDR assumes: contains is case-insensitive, which reproduces the CQL /i flag.
// HUNT: ms-settings Hijack Command Referencing dbghelp or the Edge Application Directory // MITRE: T1548.002, T1574.001, T1112 // CONF: high FP: low COST: low // REQUIRES: AsepValueUpdate, RegGenericValueUpdate // FALSE POSITIVES: none expected. A UAC-bypass command that mentions dbghelp or the Edge install path is campaign behavior // LOOKBACK: 30d #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate)$/ | RegObjectName=/\\ms-settings\\shell\\open\\command/i | RegStringValue=/(dbghelp|\\Microsoft\\Edge\\Application)/i | table([@timestamp, aid, ComputerName, UserName, RegObjectName, RegStringValue, ContextBaseFileName])
5 required fields · View requirements
Required telemetry
- Registry Value Modified
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nameregistry.keyPath: Registry key pathregistry.value: Registry value data
Recommended fields
src.process.name: Creator or acting processsrc.process.user: User
Readiness test
event.type = 'Registry Value Modified' registry.keyPath = * registry.value = * | limit 5 | columns event.type, event.time, endpoint.name, registry.keyPath, registry.value
// HUNT: ms-settings Hijack Command Referencing dbghelp or the Edge Application Directory
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1548.002, T1574.001, T1112
// CONF: high | FP: low
// FALSE POSITIVES: none expected. A UAC-bypass command that mentions dbghelp or the Edge install path is campaign behavior
// EQUIVALENCE: equivalent-with-schema-assumptions - Same two-part test: the ms-settings shell open command key and a written value that names dbghelp or the Edge Application directory.
// REQUIRES: SentinelOne Registry Value Modified telemetry
// TUNING: No exclusions expected; the pairing is campaign behavior.
// LOOKBACK: 30d; set the console time range or the query window to cover the exposure period
// CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule.
// KNOWN GAPS: A command that moves the file through a different name or an environment variable is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Registry Value Modified'
registry.keyPath contains '\\ms-settings\\shell\\open\\command'
registry.value contains ('dbghelp','\\Microsoft\\Edge\\Application')
| columns event.time, endpoint.name, src.process.user, registry.keyPath, registry.value, src.process.name, agent.uuid
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceRegistryEvents
Required fields
Timestamp: TimestampActionType: ActionTypeRegistryKey: RegistryKeyRegistryValueData: RegistryValueData
Recommended fields
InitiatingProcessFileName: InitiatingProcessFileName
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceRegistryEvents | where Timestamp > ago(1d) | where ActionType == "RegistryValueSet" | project Timestamp, ActionType, RegistryKey, RegistryValueData | take 5
// HUNT: ms-settings Hijack Command Referencing dbghelp or the Edge Application Directory // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1548.002, T1574.001, T1112 // CONF: high | FP: low // FALSE POSITIVES: none expected. A UAC-bypass command that mentions dbghelp or the Edge install path is campaign behavior // EQUIVALENCE: equivalent-with-schema-assumptions - Same two-part test: the ms-settings shell open command key and a written value that names dbghelp or the Edge Application directory. // REQUIRES: Defender for Endpoint registry telemetry (DeviceRegistryEvents) // TUNING: No exclusions expected; the pairing is campaign behavior. // LOOKBACK: 30d; extend only within Advanced Hunting retention // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A command that moves the file through a different name or an environment variable is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceRegistryEvents | where Timestamp >= ago(30d) | where ActionType == "RegistryValueSet" | where RegistryKey contains "\\ms-settings\\shell\\open\\command" | where RegistryValueData contains "dbghelp" or RegistryValueData contains "\\Microsoft\\Edge\\Application" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, RegistryKey, RegistryValueData, InitiatingProcessFileName | sort by Timestamp desc | take 200
Looks for: computerdefaults.exe is a stock auto-elevating binary and normally spawns nothing of interest. A child under it is the hijacked ms-settings command executing elevated. Hunt the child, never the binary.
Known limitations and deployment notes
- PowerQuery: A child launched by a process the agent did not observe starting is not captured.
- PowerQuery assumes: On Process Creation, tgt.process.* is the new process and src.process.* is its creator, so the CQL's parent field maps to src.process.name.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: A child launched by a process the sensor did not observe starting is not captured.
- KQL – Defender XDR assumes: !in~ is case-insensitive, which reproduces the CQL /i flag.
// HUNT: computerdefaults.exe Parent of a Command Interpreter or File-Move Utility // MITRE: T1548.002 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: none expected from a standard Windows build // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^computerdefaults(\.exe)?$/i | FileName!=/^(SystemSettings|ApplicationFrameHost)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.user: Useragent.uuid: Endpoint identifier
Readiness test
event.type = 'Process Creation' src.process.name = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: computerdefaults.exe Parent of a Command Interpreter or File-Move Utility // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1548.002 // CONF: high | FP: low // FALSE POSITIVES: none expected from a standard Windows build // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: computerdefaults as the creator and any child other than the two expected Windows hosts. Lineage re-mapped for SentinelOne. // REQUIRES: SentinelOne Process Creation telemetry // TUNING: No exclusions expected on a standard Windows build. // LOOKBACK: 30d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A child launched by a process the agent did not observe starting is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' src.process.name matches '^computerdefaults(\\.exe)?$' !(tgt.process.name matches '^(SystemSettings|ApplicationFrameHost)\\.exe$') | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: TimestampFileName: FileNameInitiatingProcessFileName: InitiatingProcessFileName
Recommended fields
ProcessCommandLine: ProcessCommandLine
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, InitiatingProcessFileName | take 5
// HUNT: computerdefaults.exe Parent of a Command Interpreter or File-Move Utility
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1548.002
// CONF: high | FP: low
// FALSE POSITIVES: none expected from a standard Windows build
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: computerdefaults as the creator and any child other than the two expected Windows hosts. The creator is InitiatingProcessFileName.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: No exclusions expected on a standard Windows build.
// LOOKBACK: 30d; extend only within Advanced Hunting retention
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A child launched by a process the sensor did not observe starting is not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(30d)
| where InitiatingProcessFileName matches regex @"(?i)^computerdefaults(\.exe)?$"
| where FileName !in~ ("SystemSettings.exe", "ApplicationFrameHost.exe")
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine
| sort by Timestamp desc
| take 200Looks for: The staging step: the PowerShell deployer copies the DLL to C:\Windows\Temp\dbghelp.tmp before the elevated move. Matches the file write or any command line naming the staging file.
Known limitations and deployment notes
- PowerQuery: A staging file renamed before it is written is not captured.
- PowerQuery assumes: File Creation covers all file types; the exact file name keeps the test narrow.
- PowerQuery assumes: Backslashes in the path regex are double-escaped as PowerQuery requires.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: The process command-line branch (a command that names dbghelp.tmp) is not covered; search DeviceProcessEvents on ProcessCommandLine for it.
- KQL – Defender XDR assumes: FolderPath holds the full path including the file name.
- KQL – Defender XDR assumes: endswith is case-insensitive, which reproduces the CQL /i flag.
// HUNT: dbghelp.tmp Staging File in Windows\Temp // MITRE: T1574.001, T1074.001, T1036.005 // CONF: high FP: low COST: low // REQUIRES: PeFileWritten, NewExecutableWritten, ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: none expected; a dbghelp.tmp in Windows\Temp is not a normal product artifact (validate once on your baseline) // LOOKBACK: 30d #event_simpleName=/^(PeFileWritten|NewExecutableWritten|ProcessRollup2|SyntheticProcessRollup2)$/ | TargetFileName=/\\Windows\\Temp\\dbghelp\.tmp$/i or CommandLine=/dbghelp\.tmp/i | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, FileName, TargetFileName, CommandLine, MD5HashData, SHA256HashData])
5 required fields · View requirements
Required telemetry
- File Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nametgt.file.path: Written file pathtgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creator or acting processsrc.process.user: Usertgt.file.md5: Written file MD5tgt.file.sha256: tgt.file.sha256
Readiness test
event.type = 'File Creation' tgt.file.path = * | limit 5 | columns event.type, event.time, endpoint.name, tgt.file.path, tgt.process.cmdline
// HUNT: dbghelp.tmp Staging File in Windows\Temp // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1574.001, T1074.001, T1036.005 // CONF: high | FP: low // FALSE POSITIVES: none expected; a dbghelp.tmp in Windows\Temp is not a normal product artifact (validate once on your baseline) // EQUIVALENCE: equivalent-with-schema-assumptions - Same two-part test: a dbghelp.tmp file written under Windows\Temp, or a process command line that names dbghelp.tmp. PE-write events map to File Creation. // REQUIRES: SentinelOne File Creation and Process Creation telemetry // TUNING: Validate once on your baseline; a dbghelp.tmp in Windows\Temp is not a normal product artifact. // LOOKBACK: 30d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A staging file renamed before it is written is not captured. // VALIDATION LEVEL: static-reviewed (event.type = 'File Creation' tgt.file.path matches '\\\\Windows\\\\Temp\\\\dbghelp\\.tmp$') or (event.type = 'Process Creation' tgt.process.cmdline contains 'dbghelp.tmp') | columns event.type, event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.file.path, tgt.process.cmdline, tgt.file.md5, tgt.file.sha256, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: TimestampFileName: FileNameFolderPath: FolderPath
Recommended fields
InitiatingProcessFileName: InitiatingProcessFileName
Optional fields
MD5: Hash
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath | take 5
// HUNT: dbghelp.tmp Staging File in Windows\Temp // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1574.001, T1074.001, T1036.005 // CONF: high | FP: low // FALSE POSITIVES: none expected; a dbghelp.tmp in Windows\Temp is not a normal product artifact (validate once on your baseline) // EQUIVALENCE: telemetry-gap - Partial pivot: the dbghelp.tmp file written under Windows\Temp (DeviceFileEvents). The CQL's second branch, a process command line naming dbghelp.tmp, is not covered. // REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents) // TUNING: Validate once on your baseline; a dbghelp.tmp in Windows\Temp is not a normal product artifact. // LOOKBACK: 30d; extend only within Advanced Hunting retention // CONFIGURATION: No lookup objects required. // KNOWN GAPS: The process command-line branch (a command that names dbghelp.tmp) is not covered; search DeviceProcessEvents on ProcessCommandLine for it. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceFileEvents | where Timestamp >= ago(30d) | where FileName =~ "dbghelp.tmp" | where FolderPath endswith "\\Windows\\Temp\\dbghelp.tmp" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, FileName, FolderPath, MD5, SHA1, SHA256 | sort by Timestamp desc | take 200
Looks for: A dbghelp.dll placed beside msedge.exe in the Edge Application directory. The name is stock; the location is the signal. Hunt by path plus writer, then confirm signer and hash on the hit. Never block by name. FP: unknown servicing behavior on your Edge build; baseline one clean host (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: A DLL placed into a versioned subfolder is outside this test, as in the CQL.
- PowerQuery assumes: File Creation covers all file types; the exact file name and folder keep the test narrow.
- PowerQuery assumes: Backslashes in the path regex are double-escaped as PowerQuery requires.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: A DLL placed into a versioned subfolder is outside this test, as in the CQL.
- KQL – Defender XDR assumes: The Program Files root is matched by contains, which covers both the native and the x86 root.
- KQL – Defender XDR assumes: endswith is case-insensitive, which reproduces the CQL /i flag.
// HUNT: dbghelp.dll Written Beside msedge.exe in the Edge Application Directory // MITRE: T1574.001, T1036.005 // CONF: high FP: medium COST: low // REQUIRES: PeFileWritten, NewExecutableWritten // FALSE POSITIVES: not expected from Edge servicing, which writes into versioned subfolders; validate against one clean reference host before alerting broadly // TUNING: on a hit, confirm the file is unsigned or not Microsoft-signed and compare MD5HashData to the published value (Q4); exclude the Edge updater writer only after confirming it on your own baseline // LOOKBACK: 30d #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\Program Files( \(x86\))?\\Microsoft\\Edge\\Application\\dbghelp\.dll$/i | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, TargetFileName, MD5HashData, SHA256HashData])
4 required fields · View requirements
Required telemetry
- File Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nametgt.file.path: Written file path
Recommended fields
src.process.name: Creator or acting processsrc.process.user: Usertgt.file.md5: Written file MD5tgt.file.sha256: tgt.file.sha256
Readiness test
event.type = 'File Creation' tgt.file.path = * | limit 5 | columns event.type, event.time, endpoint.name, tgt.file.path
// HUNT: dbghelp.dll Written Beside msedge.exe in the Edge Application Directory // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1574.001, T1036.005 // CONF: high | FP: medium // FALSE POSITIVES: not expected from Edge servicing, which writes into versioned subfolders; validate against one clean reference host before alerting broadly // EQUIVALENCE: equivalent-with-schema-assumptions - Same exact-path test for dbghelp.dll written directly into the Edge Application directory under either Program Files root. // REQUIRES: SentinelOne File Creation telemetry // TUNING: On a hit, confirm the file is unsigned or not Microsoft-signed and compare tgt.file.md5 to the published values in Q4; exclude the Edge updater writer only after confirming it on your own baseline. // LOOKBACK: 30d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A DLL placed into a versioned subfolder is outside this test, as in the CQL. // VALIDATION LEVEL: static-reviewed event.type = 'File Creation' tgt.file.path matches '\\\\Program Files( \\(x86\\))?\\\\Microsoft\\\\Edge\\\\Application\\\\dbghelp\\.dll$' | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.file.path, tgt.file.md5, tgt.file.sha256, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: TimestampFileName: FileNameFolderPath: FolderPath
Recommended fields
InitiatingProcessFileName: InitiatingProcessFileName
Optional fields
MD5: Hash
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath | take 5
// HUNT: dbghelp.dll Written Beside msedge.exe in the Edge Application Directory // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1574.001, T1036.005 // CONF: high | FP: medium // FALSE POSITIVES: not expected from Edge servicing, which writes into versioned subfolders; validate against one clean reference host before alerting broadly // EQUIVALENCE: equivalent-with-schema-assumptions - Same exact-path test for dbghelp.dll written directly into the Edge Application directory under a Program Files root. // REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents) // TUNING: On a hit, confirm the file is unsigned or not Microsoft-signed and compare MD5 to the published values in Q4; exclude the Edge updater writer only after confirming it on your own baseline. // LOOKBACK: 30d; extend only within Advanced Hunting retention // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A DLL placed into a versioned subfolder is outside this test, as in the CQL. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceFileEvents | where Timestamp >= ago(30d) | where FileName =~ "dbghelp.dll" | where FolderPath contains "\\Program Files" and FolderPath endswith "\\Microsoft\\Edge\\Application\\dbghelp.dll" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, FileName, FolderPath, MD5, SHA1, SHA256 | sort by Timestamp desc | take 200
Looks for: If the planted DLL loads, its code runs inside msedge.exe and its tasklist and ipconfig recon would appear as Edge children. Darktrace states the sideload route is intended but not proven to have succeeded, so treat this as speculative coverage. FP: browser extension helpers; baseline and exclude by CommandLine (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: A recon tool launched through a helper that is not on the child list is not captured.
- PowerQuery assumes: On Process Creation, tgt.process.* is the new process and src.process.* is its creator, so the CQL's parent field maps to src.process.name.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: A recon tool launched through a helper that is not on the child list is not captured.
- KQL – Defender XDR assumes: =~ and in~ are case-insensitive, which reproduces the CQL /i flag.
// HUNT: msedge.exe Parent of a Shell or Recon Utility // MITRE: T1574.001, T1059.003, T1057, T1016 // CONF: low FP: medium COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: native-messaging helpers and enterprise extensions can launch cmd.exe from the browser // TUNING: baseline for 30 days and exclude the specific CommandLine of known native-messaging hosts; keep any hit whose child is tasklist.exe, ipconfig.exe or an encoded PowerShell // LOOKBACK: 14d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^msedge\.exe$/i | FileName=/^(cmd|powershell|pwsh|tasklist|ipconfig|regsvr32|systeminfo|whoami)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.user: Useragent.uuid: Endpoint identifier
Readiness test
event.type = 'Process Creation' src.process.name = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: msedge.exe Parent of a Shell or Recon Utility // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1574.001, T1059.003, T1057, T1016 // CONF: low | FP: medium // FALSE POSITIVES: native-messaging helpers and enterprise extensions can launch cmd.exe from the browser // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: msedge as the creator and a shell or recon utility as the child. Lineage re-mapped for SentinelOne. // REQUIRES: SentinelOne Process Creation telemetry // TUNING: Baseline for 30 days and exclude the specific tgt.process.cmdline of known native-messaging hosts; keep any hit whose child is tasklist, ipconfig or an encoded PowerShell. // LOOKBACK: 14d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A recon tool launched through a helper that is not on the child list is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' src.process.name matches '^msedge\\.exe$' tgt.process.name matches '^(cmd|powershell|pwsh|tasklist|ipconfig|regsvr32|systeminfo|whoami)\\.exe$' | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: TimestampFileName: FileNameInitiatingProcessFileName: InitiatingProcessFileName
Recommended fields
ProcessCommandLine: ProcessCommandLine
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, InitiatingProcessFileName | take 5
// HUNT: msedge.exe Parent of a Shell or Recon Utility
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.001, T1059.003, T1057, T1016
// CONF: low | FP: medium
// FALSE POSITIVES: native-messaging helpers and enterprise extensions can launch cmd.exe from the browser
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: msedge as the creator and a shell or recon utility as the child. The creator is InitiatingProcessFileName.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Baseline for 30 days and exclude the specific ProcessCommandLine of known native-messaging hosts; keep any hit whose child is tasklist, ipconfig or an encoded PowerShell.
// LOOKBACK: 14d; extend only within Advanced Hunting retention
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A recon tool launched through a helper that is not on the child list is not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(14d)
| where InitiatingProcessFileName =~ "msedge.exe"
| where FileName in~ ("cmd.exe", "powershell.exe", "pwsh.exe", "tasklist.exe", "ipconfig.exe", "regsvr32.exe", "systeminfo.exe", "whoami.exe")
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine
| sort by Timestamp desc
| take 200Looks for: The RAT startup recon runs tasklist and ipconfig (output files tasklist_startup.txt and network_info.txt). Groups both tools under a single parent process id. FP: inventory and RMM scripts; exclude by parent after a baseline (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: PID reuse inside the time range can group two unrelated creators.
- PowerQuery: The CQL groups on its own parent process ID field; the PowerQuery groups on the creator's PID, which is the same concept.
- PowerQuery assumes: On Process Creation, tgt.process.* is the new process and src.process.* is its creator, so the CQL's parent field maps to src.process.name.
- PowerQuery assumes: src.process.pid is the creator's process ID on a Process Creation event; a reused PID within the window can merge two creators.
- PowerQuery assumes: estimate_distinct is an estimate; with two possible names it is exact in practice.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: PID reuse inside the time range can group two unrelated creators.
- KQL – Defender XDR assumes: InitiatingProcessId is the creator's process ID; a reused ID within the window can merge two creators.
// HUNT: tasklist.exe and ipconfig.exe Under the Same Parent Process // MITRE: T1057, T1016, T1082 // CONF: low FP: medium COST: medium // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: inventory scripts and RMM agents run both tools routinely // TUNING: exclude your RMM and inventory agents by ParentBaseFileName after a baseline; weight hits whose parent is a user-profile binary or msedge.exe // LOOKBACK: 7d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(tasklist|ipconfig)\.exe$/i | ParentBaseFileName!=/^(explorer|WindowsTerminal|conhost)\.exe$/i | groupBy([aid, ParentProcessId], function=[count(FileName, distinct=true, as=distinctTools), collect([ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])]) | distinctTools > 1
7 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nameagent.uuid: Endpoint identifiersrc.process.pid: Creator process IDsrc.process.name: Creator or acting processtgt.process.name: Created process name
Recommended fields
src.process.user: Usertgt.process.cmdline: Created command line
Readiness test
event.type = 'Process Creation' tgt.process.name = * src.process.pid = * | limit 5 | columns event.type, event.time, endpoint.name, agent.uuid, src.process.pid, src.process.name, tgt.process.name
// HUNT: tasklist.exe and ipconfig.exe Under the Same Parent Process // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1057, T1016, T1082 // CONF: low | FP: medium // FALSE POSITIVES: inventory scripts and RMM agents run both tools routinely // EQUIVALENCE: approximate-analytic - Same idea as the CQL: two different recon tools under one creating process on one host. The grouping key is agent.uuid plus the creator's process ID, and the distinct count is an estimate over lower-cased names. // REQUIRES: SentinelOne Process Creation telemetry // TUNING: Exclude your RMM and inventory agents by src.process.name after a baseline; weight hits whose creator is a user-profile binary or msedge. // LOOKBACK: 7d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: PID reuse inside the time range can group two unrelated creators. The CQL groups on its own parent process ID field; the PowerQuery groups on the creator's PID, which is the same concept. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' tgt.process.name matches '^(tasklist|ipconfig)\\.exe$' !(src.process.name matches '^(explorer|WindowsTerminal|conhost)\\.exe$') | let tool_name = lower(tgt.process.name) | group process_events = count(), tool_count = estimate_distinct(tool_name), first_seen = min(event.time), last_seen = max(event.time), host = any(endpoint.name), user_name = any(src.process.user), parent_name = any(src.process.name), sample_cmdline = any(tgt.process.cmdline) by agent.uuid, src.process.pid | filter tool_count > 1 | sort -last_seen | limit 200
Automated validation: static-passed
5 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: TimestampDeviceId: DeviceIdInitiatingProcessId: InitiatingProcessIdFileName: FileNameInitiatingProcessFileName: InitiatingProcessFileName
Recommended fields
ProcessCommandLine: ProcessCommandLine
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, DeviceId, InitiatingProcessId, FileName, InitiatingProcessFileName | take 5
// HUNT: tasklist.exe and ipconfig.exe Under the Same Parent Process
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1057, T1016, T1082
// CONF: low | FP: medium
// FALSE POSITIVES: inventory scripts and RMM agents run both tools routinely
// EQUIVALENCE: approximate-analytic - Same idea as the CQL: two different recon tools under one creating process on one device. The grouping key is DeviceId plus the creator's process ID, and the distinct count is over lower-cased names.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude your RMM and inventory agents by InitiatingProcessFileName after a baseline; weight hits whose creator is a user-profile binary or msedge.
// LOOKBACK: 7d; extend only within Advanced Hunting retention
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: PID reuse inside the time range can group two unrelated creators.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where FileName in~ ("tasklist.exe", "ipconfig.exe")
| where InitiatingProcessFileName !in~ ("explorer.exe", "WindowsTerminal.exe", "conhost.exe")
| summarize ProcessEvents = count(), DistinctTools = dcount(tolower(FileName)), FirstSeen = min(Timestamp), LastSeen = max(Timestamp), Host = any(DeviceName), ParentName = any(InitiatingProcessFileName), Commands = make_set(ProcessCommandLine, 5) by DeviceId, InitiatingProcessId
| where DistinctTools > 1
| sort by LastSeen desc
| take 200Looks for: Discord is a shared legitimate service, so this is a behavioral hunt on the process, never an indicator. Resolves Discord domains and keeps events where the connecting process is not a browser or a known collaboration client. FP: SDK-embedding apps; baseline and exclude by process name (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: The remote address and port the CQL returns from the connection join are not returned.
- PowerQuery: Lookups made through an encrypted resolver that bypasses the host stack are not captured.
- PowerQuery assumes: event.dns.request is the pySigma-mapped DNS field; some schema versions use dns.request instead, so run the readiness test first.
- PowerQuery assumes: On a DNS Resolved event the acting process is src.process.*.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: The remote address and port the CQL returns from the connection join are not returned.
- KQL – Defender XDR: Hosts without the network inspection DNS events enabled return nothing.
- KQL – Defender XDR assumes: DnsQueryResponse is attested in Microsoft-owned hunting repositories but not enumerated on Microsoft Learn.
- KQL – Defender XDR assumes: The name is read from DnsQueryString or QueryName in AdditionalFields, whichever the tenant populates; the readiness test shows which.
- KQL – Defender XDR assumes: matches regex with the (?i) prefix reproduces the CQL /i flag.
// HUNT: Discord Domain Lookup by an Unexpected Process // MITRE: T1102.002, T1071.001 // CONF: medium FP: medium COST: medium // REQUIRES: DnsRequest, NetworkConnectIP4 // FALSE POSITIVES: any app embedding the Discord SDK, game launchers, and bot or webhook integrations run by IT // TUNING: baseline the processes that legitimately reach Discord, then exclude them by ContextBaseFileName; prioritise user-profile or Temp binaries, msedge.exe, powershell.exe and unsigned images. Do not turn Discord domains into IOC blocks // LOOKBACK: 7d #event_simpleName=DnsRequest | DomainName=/(^|\.)(discord\.com|discordapp\.com|discord\.gg|discordapp\.net)$/i | join(query={#event_simpleName=NetworkConnectIP4}, field=[aid, ContextProcessId_decimal], include=[ContextBaseFileName, RemoteAddressIP4, RemotePort], mode=left) | ContextBaseFileName!=/^(chrome|msedge|firefox|brave|opera|iexplore|discord|update|ms-teams|teams|slack)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, DomainName, ContextBaseFileName, RemoteAddressIP4, RemotePort])
5 required fields · View requirements
Required telemetry
- DNS Resolved
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nameevent.dns.request: DNS name queriedsrc.process.name: Creator or acting process
Recommended fields
src.process.user: Usersrc.process.image.path: src.process.image.path
Readiness test
event.type = 'DNS Resolved' event.dns.request = * | limit 5 | columns event.type, event.time, endpoint.name, event.dns.request, src.process.name
// HUNT: Discord Domain Lookup by an Unexpected Process // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1102.002, T1071.001 // CONF: medium | FP: medium // FALSE POSITIVES: any app embedding the Discord SDK, game launchers, and bot or webhook integrations run by IT // EQUIVALENCE: approximate-analytic - The CQL joins DNS requests to network connections to learn the process; a SentinelOne DNS Resolved event already names the acting process, so the join is dropped and the remote address and port columns are not returned. // REQUIRES: SentinelOne DNS Resolved telemetry with the acting process // TUNING: Baseline the processes that legitimately reach Discord, then exclude them by src.process.name; prioritise user-profile or Temp binaries, msedge, powershell and unsigned images. Do not turn Discord domains into IOC blocks. // LOOKBACK: 7d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: The remote address and port the CQL returns from the connection join are not returned. Lookups made through an encrypted resolver that bypasses the host stack are not captured. // VALIDATION LEVEL: static-reviewed event.type = 'DNS Resolved' event.dns.request matches '(^|\\.)(discord\\.com|discordapp\\.com|discord\\.gg|discordapp\\.net)$' !(src.process.name matches '^(chrome|msedge|firefox|brave|opera|iexplore|discord|update|ms-teams|teams|slack)\\.exe$') | columns event.time, endpoint.name, src.process.user, event.dns.request, src.process.name, src.process.image.path, agent.uuid | limit 200
Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: TimestampActionType: ActionTypeAdditionalFields: AdditionalFieldsInitiatingProcessFileName: InitiatingProcessFileName
Recommended fields
InitiatingProcessFolderPath: InitiatingProcessFolderPath
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields, InitiatingProcessFileName | take 5
// HUNT: Discord Domain Lookup by an Unexpected Process
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1102.002, T1071.001
// CONF: medium | FP: medium
// FALSE POSITIVES: any app embedding the Discord SDK, game launchers, and bot or webhook integrations run by IT
// EQUIVALENCE: equivalent-with-schema-assumptions - Defender has no endpoint DNS table: the name is read from DnsQueryResponse events in DeviceEvents and the acting process is InitiatingProcessFileName. The CQL's connection join (remote address and port) is dropped.
// REQUIRES: Defender for Endpoint network inspection DNS events (DeviceEvents, ActionType DnsQueryResponse)
// TUNING: Baseline the processes that legitimately reach Discord, then exclude them by InitiatingProcessFileName; prioritise user-profile or Temp binaries, msedge, powershell and unsigned images. Do not turn Discord domains into IOC blocks.
// LOOKBACK: 7d; extend only within Advanced Hunting retention
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The remote address and port the CQL returns from the connection join are not returned. Hosts without the network inspection DNS events enabled return nothing.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceEvents
| where Timestamp >= ago(7d)
| where ActionType == "DnsQueryResponse"
| extend QueryName = tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"]))
| where QueryName matches regex @"(?i)(^|\.)(discord\.com|discordapp\.com|discord\.gg|discordapp\.net)$"
| where InitiatingProcessFileName !in~ ("chrome.exe", "msedge.exe", "firefox.exe", "brave.exe", "opera.exe", "iexplore.exe", "discord.exe", "update.exe", "ms-teams.exe", "teams.exe", "slack.exe")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, QueryName, InitiatingProcessFileName, InitiatingProcessFolderPath
| sort by Timestamp desc
| take 200Looks for: Darktrace saw a ZIP of a directory exfiltrated using ngrok but published no endpoint. Without an indicator, the only angle is ngrok itself appearing where it has no business reason. The domain list is analyst knowledge of ngrok service names, not a value from the Darktrace snapshot. FP: developer and demo use; exclude developer host groups (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: Lookups made through an encrypted resolver that bypasses the host stack are not captured.
- PowerQuery assumes: event.dns.request is the pySigma-mapped DNS field; some schema versions use dns.request instead, so run the readiness test first.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: Hosts without the network inspection DNS events enabled return nothing.
- KQL – Defender XDR assumes: DnsQueryResponse is attested in Microsoft-owned hunting repositories but not enumerated on Microsoft Learn.
- KQL – Defender XDR assumes: The name is read from DnsQueryString or QueryName in AdditionalFields, whichever the tenant populates; the readiness test shows which.
- KQL – Defender XDR assumes: matches regex with the (?i) prefix reproduces the CQL /i flag.
// HUNT: ngrok Tunnel Service Name Resolution // MITRE: T1567, T1041 // CONF: low FP: medium COST: low // REQUIRES: DnsRequest // FALSE POSITIVES: developers, demo environments and webhook testing use ngrok legitimately // TUNING: exclude known developer subnets or host groups; weight hits from hosts that also fired Q9, Q10 or Q13. ngrok is a shared service, so never convert this into an IOC block // LOOKBACK: 14d #event_simpleName=DnsRequest | DomainName=/(^|\.)(ngrok\.com|ngrok\.io|ngrok\.app|ngrok\.dev|ngrok-free\.app|ngrok-free\.dev|ngrok-agent\.com)$/i | table([@timestamp, aid, ComputerName, UserName, DomainName, ContextProcessId])
4 required fields · View requirements
Required telemetry
- DNS Resolved
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host nameevent.dns.request: DNS name queried
Recommended fields
src.process.name: Creator or acting processsrc.process.user: User
Readiness test
event.type = 'DNS Resolved' event.dns.request = * | limit 5 | columns event.type, event.time, endpoint.name, event.dns.request
// HUNT: ngrok Tunnel Service Name Resolution // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1567, T1041 // CONF: low | FP: medium // FALSE POSITIVES: developers, demo environments and webhook testing use ngrok legitimately // EQUIVALENCE: equivalent-with-schema-assumptions - Same domain-suffix test across the seven ngrok service domains on DNS resolution events. // REQUIRES: SentinelOne DNS Resolved telemetry // TUNING: Exclude known developer subnets or host groups; weight hits from hosts that also fired Q9, Q10 or Q13. ngrok is a shared service, so never convert this into an IOC block. // LOOKBACK: 14d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: Lookups made through an encrypted resolver that bypasses the host stack are not captured. // VALIDATION LEVEL: static-reviewed event.type = 'DNS Resolved' event.dns.request matches '(^|\\.)(ngrok\\.com|ngrok\\.io|ngrok\\.app|ngrok\\.dev|ngrok-free\\.app|ngrok-free\\.dev|ngrok-agent\\.com)$' | columns event.time, endpoint.name, src.process.user, event.dns.request, src.process.name, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: TimestampActionType: ActionTypeAdditionalFields: AdditionalFields
Recommended fields
InitiatingProcessFileName: InitiatingProcessFileName
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields | take 5
// HUNT: ngrok Tunnel Service Name Resolution // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1567, T1041 // CONF: low | FP: medium // FALSE POSITIVES: developers, demo environments and webhook testing use ngrok legitimately // EQUIVALENCE: equivalent-with-schema-assumptions - Defender has no endpoint DNS table: the name is read from DnsQueryResponse events in DeviceEvents and tested against the seven ngrok service domains. // REQUIRES: Defender for Endpoint network inspection DNS events (DeviceEvents, ActionType DnsQueryResponse) // TUNING: Exclude known developer subnets or host groups; weight hits from hosts that also fired Q9, Q10 or Q13. ngrok is a shared service, so never convert this into an IOC block. // LOOKBACK: 14d; extend only within Advanced Hunting retention // CONFIGURATION: No lookup objects required. // KNOWN GAPS: Hosts without the network inspection DNS events enabled return nothing. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceEvents | where Timestamp >= ago(14d) | where ActionType == "DnsQueryResponse" | extend QueryName = tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"])) | where QueryName matches regex @"(?i)(^|\.)(ngrok\.com|ngrok\.io|ngrok\.app|ngrok\.dev|ngrok-free\.app|ngrok-free\.dev|ngrok-agent\.com)$" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, QueryName, InitiatingProcessFileName | sort by Timestamp desc | take 200
Looks for: An ngrok executable or a command line using ngrok tunnelling verbs. The report shows the operator driving ngrok from PowerShell sent through Discord to exfiltrate an archive. FP: developer use; exclude developer host groups (see TUNING in the query).
Known limitations and deployment notes
- PowerQuery: A renamed tunnel client with no ngrok string on the command line is not captured.
- PowerQuery assumes: Case-insensitive matching is the PowerQuery default for contains and matches, which reproduces the CQL /i intent.
- KQL – Defender XDR: A renamed tunnel client with no ngrok string on the command line is not captured.
- KQL – Defender XDR assumes: matches regex with the (?i) prefix reproduces the CQL /i flag.
// HUNT: ngrok Executable or Tunnel Command Line // MITRE: T1567, T1041, T1560.001 // CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: developer workstations and CI runners that use ngrok // TUNING: exclude developer host groups; prioritise ngrok started by powershell.exe or cmd.exe, from a Temp or user-profile path, or shortly after a Compress-Archive or zip step on the same aid // LOOKBACK: 14d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^ngrok(\.exe)?$/i or CommandLine=/ngrok(\.exe)?[^a-z0-9]+(http|tcp|tls|tunnel|authtoken)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
6 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timeendpoint.name: Host namesrc.process.name: Creator or acting processtgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.user: Useragent.uuid: Endpoint identifier
Readiness test
event.type = 'Process Creation' tgt.process.name = * | limit 5 | columns event.type, event.time, endpoint.name, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: ngrok Executable or Tunnel Command Line // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1567, T1041, T1560.001 // CONF: medium | FP: medium // FALSE POSITIVES: developer workstations and CI runners that use ngrok // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: an ngrok image name, or ngrok followed by a tunnel verb on the command line. // REQUIRES: SentinelOne Process Creation telemetry with command lines // TUNING: Exclude developer host groups; prioritise ngrok started by a command interpreter, from a Temp or user-profile path, or shortly after an archive step on the same endpoint. // LOOKBACK: 14d; set the console time range or the query window to cover the exposure period // CONFIGURATION: No lookup tables or custom detection objects required; paste the query into Event Search or a scheduled PowerQuery rule. // KNOWN GAPS: A renamed tunnel client with no ngrok string on the command line is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' (tgt.process.name matches '^ngrok(\\.exe)?$' or tgt.process.cmdline matches 'ngrok(\\.exe)?[^a-z0-9]+(http|tcp|tls|tunnel|authtoken)') | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, agent.uuid | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: TimestampFileName: FileNameProcessCommandLine: ProcessCommandLine
Recommended fields
InitiatingProcessFileName: InitiatingProcessFileName
Optional fields
SHA1: Hash. SHA256 is often unpopulated in this table.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, ProcessCommandLine | take 5
// HUNT: ngrok Executable or Tunnel Command Line // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1567, T1041, T1560.001 // CONF: medium | FP: medium // FALSE POSITIVES: developer workstations and CI runners that use ngrok // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: an ngrok image name, or ngrok followed by a tunnel verb on the command line. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: Exclude developer host groups; prioritise ngrok started by a command interpreter, from a Temp or user-profile path, or shortly after an archive step on the same device. // LOOKBACK: 14d; extend only within Advanced Hunting retention // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A renamed tunnel client with no ngrok string on the command line is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(14d) | where FileName matches regex @"(?i)^ngrok(\.exe)?$" or ProcessCommandLine matches regex @"(?i)ngrok(\.exe)?[^a-z0-9]+(http|tcp|tls|tunnel|authtoken)" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine | sort by Timestamp desc | take 200
Detection Rules by Platform
CrowdStrike: Custom IOA
| IOA name | Pattern (Process Creation / Registry / File Write, Windows) | Promotes | Action | Exclusions |
|---|---|---|---|---|
| ms-settings open command written with dbghelp or Edge path | Registry value set; key matches \ms-settings\shell\open\command and value matches (?i)(dbghelp|\Microsoft\Edge\Application) | Promote Q7 | Detect, high | None needed |
| computerdefaults.exe spawning a child | Process Creation; parent image .*\\computerdefaults\.exe; child not SystemSettings.exe or ApplicationFrameHost.exe | Promote Q8 | Detect, high | Authorised pen-test hosts by aid |
| dbghelp.dll written into the Edge Application directory | File write; path (?i).*\\Microsoft\\Edge\\Application\\dbghelp\.dll | Promote Q10 | Detect, high; never prevent | Confirm Edge servicing behavior on a clean host first |
| dbghelp.tmp staged in Windows Temp | File write; path (?i).*\\Windows\\Temp\\dbghelp\.tmp | Promote Q9 | Detect, high | None needed |
Alert package: Q7, Q8, Q10
- Scheduled search name: DETECT - CikaBika UAC Bypass or Edge Sideload (Windows)
- Description: Fires when the ms-settings open command is written with a dbghelp or Edge reference, computerdefaults.exe spawns a child, or a dbghelp.dll is written beside msedge.exe. Indicates the CikaBika elevation and sideload steps.
- Email subject: [HIGH] Detection: CikaBika Bot - UAC bypass / Edge DLL sideload on <ComputerName>
- Body: What fired (query, host, user, command or path). Meaning: the host ran a shortcut-launched loader and an elevated DLL move occurred; the RAT may already be talking to a Discord channel. Immediate action: network-contain the host, do not delete the DLL before copying it and hashing it. Escalate to the IR lead on any confirmed hit.
Triage checklist (L1)
- Confirm the host and user; check whether a disk image or shortcut was opened from Downloads or mail cache.
- Pull the writer process and parent chain for the hit.
- Hash the dbghelp.dll beside msedge.exe and check signer; compare MD5 to the published value.
- Check for
%TEMP%\IfyuUapz.txtandC:\Windows\Temp\dbghelp.tmp. - Read the ms-settings key value for the user hive.
- Run Q13, Q14 and Q15 on the same aid for Discord and ngrok use.
- Network-contain, then follow the containment runbook.
Pivot queries
// host-scoped: everything the aid did around a hit (set the aid, window +/- 1h) aid=REPLACE_WITH_AID | #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|AsepValueUpdate|RegGenericValueUpdate|DnsRequest)$/ | table([@timestamp, #event_simpleName, FileName, TargetFileName, CommandLine, RegObjectName, DomainName]) | sort(@timestamp, order=asc) // environment-wide: who else has an unsigned dbghelp.dll in an Edge folder (hash review) #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\Edge\\Application\\dbghelp\.dll$/i | groupBy([MD5HashData], function=[count(aid, distinct=true, as=hosts)])
SentinelOne: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| ms-settings open command written with dbghelp or Edge path | Q7, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| computerdefaults.exe spawning a child | Q8, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| dbghelp.dll written into the Edge Application directory | Q10, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| dbghelp.tmp staged in Windows Temp | Q9, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
Create the rule with POST /web/api/v2.1/cloud-detection/rules, queryType: "scheduled" and queryLang: "2.0", with the query in data.scheduledParams.query. Use 2.0 operator spellings: a rule written with the 1.0 token ContainsCIS was accepted and never fired on a tenant. The API does not warn, so lint the body before deploying.
Microsoft Defender: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| ms-settings open command written with dbghelp or Edge path | Q7, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| computerdefaults.exe spawning a child | Q8, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| dbghelp.dll written into the Edge Application directory | Q10, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| dbghelp.tmp staged in Windows Temp | Q9, KQL – Defender XDR tab | Hunt only until the gap is closed | Q9 is only an approximation here. Partial pivot: the dbghelp.tmp file written under Windows\Temp (DeviceFileEvents). The CQL's second branch, a process command line naming dbghelp.tmp, is not covered. |
Q1, Q2, Q3, Q4, Q5, Q6, Q11, Q12, Q13, Q14 and Q15 stay a hunt in this pack, not a rule. A rule can generate only 150 alerts per run. Continuous (NRT) frequency needs a single table and no comment lines, so delete the generated comment header from the query first.
Machine-Readable IOC Appendix
Only the four MD5 hashes are importable, all at detect and never critical, because they have one origin (Darktrace). No network indicator exists to import: Darktrace published no Discord channel, token, webhook, ngrok endpoint, IP or domain, and Discord and ngrok are shared legitimate services that must not be blocked as indicators. No hash is attached to a stock binary as a prevent action.
type,value,action,severity,expiration,description,tags md5,2deb724a709b0b892248405323350e9b,detect,high,2027-04-15,CikaBika Nim loader IfyuUapz.txt (Darktrace),campaign:CikaBika md5,c66858718d883bcfb9ce2c19b59f96c9,detect,high,2027-04-15,CikaBika Rust RAT DLL listed as dbghelp.dll (Darktrace),campaign:CikaBika md5,62e3e85eca78a0cd7e6669e9f33d936d,detect,medium,2027-04-15,CikaBika shortcut Proposition_Projet_Personnalisable.docx.lnk (Darktrace),campaign:CikaBika md5,eeb52cb95113a131c2c7713c17872da6,detect,medium,2027-04-15,CikaBika decoy PDF Presentation_Generale.pdf.pdf (Darktrace),campaign:CikaBika
This pack does not ship a SentinelOne import block: the import format could not be verified against SentinelOne's own documentation. Export a sample from your console and the block can be added with confidence.
# Behavioral signatures (not importable IOCs) Path: C:\Windows\Temp\dbghelp.tmp (DLL staging) Path: C:\Program Files (x86)\Microsoft\Edge\Application\dbghelp.dll (name is stock, location is the signal) Path: %TEMP%\IfyuUapz.txt (PE disguised as text) Registry: HKCU\Software\Classes\ms-settings\shell\open\command (UAC bypass key) Parent: computerdefaults.exe spawning any child Files: Proposition_Projet.img, Proposition_Projet_Personnalisable.docx.lnk, Presentation_Generale.pdf.pdf Output: tasklist_startup.txt, network_info.txt (screenshot.png is too generic alone) Rule: never block dbghelp.dll, computerdefaults.exe, msedge.exe, powershell.exe, Discord or ngrok by name
# Named malware and tooling (labels only)
CikaBika Bot Rust RAT, Discord C2 (Darktrace)
Loader Nim, writes IfyuUapz.txt, carries Rust DLL + PowerShell deployer
Bot commands !shell !sysinfo !info !isOn !tasklist !ps !kill !upload !download
strings only: !src !camera !stream !broadcast
Shared services Discord (C2), ngrok (exfiltration), ipify.com (public IP lookup)
# Commands travel inside TLS to Discord; they are not endpoint-detectable strings.# Audit checklist (read-only) [ ] Edge Application directory contains no dbghelp.dll beside msedge.exe [ ] No C:\Windows\Temp\dbghelp.tmp [ ] HKCU\Software\Classes\ms-settings\shell\open\command absent on every user hive [ ] No IfyuUapz.txt in user Temp folders [ ] UAC ConsentPromptBehaviorAdmin = 2 (secure-desktop consent) on admin workstations [ ] Script block logging enabled (EnableScriptBlockLogging = 1) [ ] Disk image auto-mount reviewed for standard users [ ] Discord and ngrok egress logged at the proxy or DNS layer
Detection Validation Gates
| Gate | Check | Pass criteria |
|---|---|---|
| Telemetry ready | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Executable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); Registry value set (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents); DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: no endpoint DNS table) | Each source returns data for a test host in the last hour; registry events include per-user hive keys |
| Benign baseline | Q3, Q5, Q10, Q11, Q12, Q13, Q14, Q15 over 30 days | Document installer, developer and RMM noise and add the exclusions named in each TUNING line before alerting |
| Positive tests | On an isolated lab host only: create a harmless text file named IfyuUapz.txt in Temp; write a benign value under the ms-settings open command key then remove it; copy a benign file to Windows\Temp\dbghelp.tmp | Q2, Q6/Q7 and Q9 fire; remove the test artifacts afterwards. No malware is run |
| Promotion | Q7, Q8, Q9, Q10 as Custom IOA detect rules | Zero unexplained hits for 14 days or each hit triaged; no prevent action on any stock binary |
| Hypothesis checks | Q1 and Q5 command-line tokens; Q10 location on a clean Edge host | Confirm in tenant: Darktrace shows the shortcut command only as an image |
Hardening: Tiered & Deployable
Controls are anchored to MITRE mitigations (M-numbers) plus a platform authority. Controls with no formal benchmark are marked.
- Secure-desktop UAC consent for admin accounts (T1548.002, M1052 User Account Control; CIS Windows benchmark UAC settings). Setting
ConsentPromptBehaviorAdminto 2 removes silent auto-elevation of the class used here. Playbook step 1. - PowerShell script block logging (T1059.001, M1047 Audit; CIS Windows benchmark). Makes the decode-and-drop script visible. Playbook step 2.
- Remove standing local admin from daily-driver accounts (T1548.002, M1026 Privileged Account Management; Microsoft security baseline guidance). Darktrace notes the bypass depends on Windows configuration; a standard user does not auto-elevate.
- Block disk-image attachments at the mail and web gateway (T1204.002, M1017 User Training and gateway filtering; vendor gateway guidance). Quarantine .iso, .img, .vhd and .vhdx from external senders unless a business owner exists.
- Disable double-click mounting of ISO and IMG for standard users (T1204.002, M1038 Execution Prevention; ⚠ best-practice, no formal benchmark). Playbook step 3; confirm the .img association on your build before rollout.
- ASR rule: block execution of potentially obfuscated scripts in audit mode, then block (T1027, T1059.001, M1038; Microsoft Defender ASR reference). Playbook step 4.
- Collect image-load events for Edge (T1574.001, M1047): Sysmon Event 7 scoped to msedge.exe, so the DLL load Darktrace could not prove becomes visible.
- Egress visibility for Discord and ngrok (T1102.002, T1567, M1031 Network Intrusion Prevention; ⚠ best-practice, no formal benchmark). Log at the proxy or DNS layer. Whether to restrict either service is a business decision per environment; this pack does not ship them as IOC blocks.
- App Control for Business (WDAC) with DLL enforcement, audit first (T1574.001, M1038, M1044 Restrict Library Loading; Microsoft App Control guidance). An unsigned DLL in the Edge directory would not load.
- Verified file-integrity monitoring of browser install directories (T1574.001, M1022 Restrict File and Directory Permissions, M1047): alert on any new DLL beside msedge.exe.
- Restrict unsigned-process egress with host firewall or EDR network control so a user-profile binary cannot reach the internet unprompted (T1102, M1037 Filter Network Traffic).
Deployable Playbooks
Each step carries Prerequisites, Reboot required and Rollback. Pilot on a ring before fleet rollout.
# Step 1: UAC secure-desktop consent for administrators # Prerequisites: local admin; pilot on a ring of admin workstations first (admins will see more prompts) # Reboot required: no (takes effect for new elevation requests) reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 2 /f reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableLUA /t REG_DWORD /d 1 /f # Verify: (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System").ConsentPromptBehaviorAdmin # Rollback: restore the Windows default (prompt for consent for non-Windows binaries) reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 5 /f
# Step 2: PowerShell script block logging # Prerequisites: local admin; confirm event log size for Microsoft-Windows-PowerShell/Operational (raise to at least 128 MB) # Reboot required: no reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f # Verify: (Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging").EnableScriptBlockLogging # Rollback: reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" /v EnableScriptBlockLogging /f
# Step 3: Hide the Mount verb for ISO images from standard users (PILOT; best-practice, no formal benchmark) # Prerequisites: local admin; confirm the .img association on your build resolves to Windows.IsoFile (assoc check below); tell users who legitimately mount images # Reboot required: no (restart Explorer or sign out/in to see the change) cmd /c assoc .iso cmd /c assoc .img reg add "HKLM\SOFTWARE\Classes\Windows.IsoFile\shell\mount" /v ProgrammaticAccessOnly /t REG_SZ /d "" /f # Verify: right-click an .iso as a standard user; the Mount entry is absent # Rollback: reg delete "HKLM\SOFTWARE\Classes\Windows.IsoFile\shell\mount" /v ProgrammaticAccessOnly /f
# Step 4: ASR "Block execution of potentially obfuscated scripts" in AUDIT mode first # Prerequisites: Microsoft Defender Antivirus active; local admin # Reboot required: no Add-MpPreference -AttackSurfaceReductionRules_Ids 5BEB7EFE-FD9A-4556-801D-275E5FFC04CC -AttackSurfaceReductionRules_Actions AuditMode # Verify: (Get-MpPreference).AttackSurfaceReductionRules_Ids # After 14 days of clean audit events, switch the action to Enabled: # Add-MpPreference -AttackSurfaceReductionRules_Ids 5BEB7EFE-FD9A-4556-801D-275E5FFC04CC -AttackSurfaceReductionRules_Actions Enabled # Rollback: Add-MpPreference -AttackSurfaceReductionRules_Ids 5BEB7EFE-FD9A-4556-801D-275E5FFC04CC -AttackSurfaceReductionRules_Actions Disabled
# Step 5: Read-only exposure audit (no changes made)
# Prerequisites: run elevated; for other users' registry hives load them first or run per user
# Reboot required: no
# Rollback: none required (read-only)
$edge = Join-Path ${env:ProgramFiles(x86)} 'Microsoft\Edge\Application\dbghelp.dll'
if (Test-Path $edge) { Get-FileHash $edge -Algorithm MD5; Get-AuthenticodeSignature $edge | Select-Object Status, SignerCertificate }
Test-Path 'C:\Windows\Temp\dbghelp.tmp'
Get-ChildItem "$env:SystemDrive\Users\*\AppData\Local\Temp\IfyuUapz.txt" -ErrorAction SilentlyContinue
Get-ItemProperty 'HKCU:\Software\Classes\ms-settings\shell\open\command' -ErrorAction SilentlyContinueContainment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host with the EDR (do not power off). Block nothing by stock-binary name. If a user session is active, lock it. | SOC / IR | Containment timestamp, host and user |
| Isolate: by platform | CrowdStrike: network-contain the host. SentinelOne: network quarantine (Disconnect from Network; confirm the label in your console version). Microsoft Defender: Isolate device (full network isolation). | SOC / IR | Containment timestamp, host and user |
| Preserve | Copy, then hash, the dbghelp.dll beside msedge.exe, C:\Windows\Temp\dbghelp.tmp, %TEMP%\IfyuUapz.txt, the shortcut and image if still present. Export the HKCU ms-settings key. Capture memory if the policy allows. | IR | File hashes, MD5 match against section 4, registry export |
| Scope | Run Q1 to Q15 on the aid and then fleet-wide; look for the same image or shortcut names; check mail and web logs for the delivery path (unconfirmed by Darktrace). | SOC | Hit list, delivery vector |
| Eradicate | After preservation: remove the planted dbghelp.dll only once it is confirmed unsigned or hash-matched (the name is stock, never delete by name), delete dbghelp.tmp and IfyuUapz.txt, remove the ms-settings open command key, then reinstall or repair Edge to restore a clean Application folder. Reimage if the RAT ran. | IR | Before and after file listing |
| Credentials and data | Assume the desktop and user documents were reachable (the operator has a download command and used ngrok). Rotate credentials and sessions the user had on that host; review what left the host in proxy logs. | Identity / Data owner | Rotation log, exfiltration estimate |
| Recover | Return the host after reimage; keep Q6 to Q10 as scheduled searches for 30 days; apply the Immediate hardening tier. | IT / SOC | Re-hunt results at 7 and 30 days |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | CrowdStrike coverage | SentinelOne | Defender XDR |
|---|---|---|---|---|---|---|
| T1204.002, T1036.007 | Image, shortcut and double-extension PDF by name and hash | Q2, Q4 | None | Good | Good, with assumptions | Partial: Q2 telemetry gap, Q4 telemetry gap |
| T1059.001, T1140, T1027.013 | PowerShell decoding an embedded executable | Q1, Q3 | None | Partial (command tokens unverified) | Partial: Q3 unavailable | Partial: Q3 unavailable |
| T1548.002, T1112 | ms-settings hijack and computerdefaults child | Q6, Q7, Q8 | Q7, Q8 | Good | Good, with assumptions | Good, with assumptions |
| T1574.001 | Staging file and DLL beside msedge.exe | Q9, Q10 | Q9, Q10 | Good | Good, with assumptions | Partial: Q9 telemetry gap |
| T1574.001 | msedge.exe actually loading the DLL (module load) | Q11 (indirect) | None | GAP endpoint image-load; use Sysmon Event 7 | GAP: same limit as CrowdStrike | GAP: same limit as CrowdStrike |
| T1218.010, T1564.003, T1070.004 | regsvr32 fallback, hidden windows, cleanup | Q5 | None | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1057, T1016, T1082 | Recon at startup | Q11, Q12 | None | Partial | Partial: Q12 approximate | Partial: Q12 approximate |
| T1113, T1005, T1074.001, T1560.001 | Screenshot, file download, ZIP staging | None | None | GAP outside endpoint telemetry for screenshots and reads | GAP | GAP |
| T1102.002 | Discord C2 | Q13 | None | Partial process-context only; shared service, no published channel, token or IP | Partial: Q13 approximate | Partial: same limit as CrowdStrike |
| T1567, T1041 | ngrok and Discord file return | Q14, Q15 | None | Partial no endpoint published; ngrok names are analyst knowledge | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
Validation gates (section 11): run the baseline before alerting on Q3, Q5, Q10 to Q15; positive-test Q2, Q6, Q7 and Q9 on an isolated lab host only.
Hunt Summary Ticket
TITLE: CikaBika Bot: Rust RAT with Discord C2, Nim loader, ms-settings UAC bypass and Edge dbghelp.dll sideload SEVERITY: High (single-origin intelligence; no actor attribution published) DATE: 2026-10-15 VERSION: v0.1 Draft 2026-10-15 SCOPE: Windows endpoints where users can mount disk images and run shortcuts; Edge install directories; admin workstations in default UAC mode HYPOTHESIS: A mounted image's shortcut decodes a Nim loader, which hijacks ms-settings to elevate a DLL move into the Edge directory, then the RAT registers to a per-device Discord channel and exfiltrates with ngrok. QUERIES: Q1 PDF-byte decode; Q2 published names; Q3 disguised PE; Q4 MD5; Q5 regsvr32; Q6 and Q7 ms-settings; Q8 computerdefaults child; Q9 dbghelp.tmp; Q10 Edge dir DLL; Q11 msedge children; Q12 recon pair; Q13 Discord; Q14 and Q15 ngrok DO FIRST: Run Q6, Q7, Q8, Q9 and Q10 over 30 days; run the read-only audit (playbook step 5) on admin workstations. FINDINGS: any published name or MD5, an ms-settings write, a computerdefaults child, dbghelp.tmp, or a dbghelp.dll beside msedge.exe. GAPS: the DLL load into msedge.exe, screenshot and camera capture, file reads, Discord message content and ngrok endpoints are outside endpoint telemetry or unpublished; Discord and ngrok coverage is process-context only. ACTIONS: contain, preserve then eradicate by hash not by name, rotate credentials (containment runbook), apply Immediate hardening. OWNER: SOC / Incident Response FOLLOW-UP: Re-hunt after 7 and 30 days and on any Darktrace or independent IOC update.
Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| T1 | Darktrace: CikaBika Bot: Inside a Discord RAT (2026-10-14) | Primary analysis, all hashes, filenames, paths and ATT&CK IDs (snapshot 01) | 2026-10-15 |
| Ref | MITRE ATT&CK | Technique IDs as listed in the Darktrace post and mitigation M-numbers | 2026-10-15 |