CikaBika Bot: Discord RAT via Nim Loader and Edge DLL Sideload

Image and shortcut lure, ms-settings UAC bypass, dbghelp.dll hijack of Microsoft Edge, Discord C2 and ngrok exfiltration · detection, response and hardening
Threat
CikaBika Bot
Severity
HIGH
Type
Rust RAT, Discord C2
Access
Disk image with disguised shortcut (delivery unconfirmed)
Version
v0.1 Draft · 2026-10-15
Author
HuntPack
Confidence
Medium: single-origin intelligence, no actor attribution
01

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.

Defender priority: run Q6, Q7, Q8 and Q10 over 30 days to find the elevation and sideload steps, and Q2 and Q4 for the published artifacts. On any confirmed host treat the user's desktop and documents as exposed (the operator has a file-download command) and the Discord and ngrok traffic as outside endpoint telemetry. Network-indicator coverage is genuinely weak, see section 15.
02

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.

TierSourceKey findingCarry forward
T1Darktrace: 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/aMallory 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 snapshotno
n/aNetmanageIT blog index named in the taskingFetched the front page and searched it; no CikaBika post found. Dropped, not citedno
n/aWeb search for independent CikaBika coverageOnly the Darktrace post and aggregator echoes of its abstract. No independent technical source foundno
Reading notes: Darktrace shows several key strings (the PowerShell in the shortcut, the Discord configuration, the exfiltration commands) only as screenshots, so they are not in the extractable text and are not reproduced here. The report also says the Edge sideload route is the attacker's intended path, not proof that Edge loaded the planted DLL, because the DLL exports only a subset of the functions in Edge's delay-import table. The IOC list labels both the loader and the DLL with the name 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.
03

Hunt Brief & Attack Chain

Hypotheses (ordered by fidelity)

  1. H1, high: a dbghelp.dll is written beside msedge.exe in the Edge Application directory (T1574.001). Q10, with Q4 for the hash.
  2. H2, high: the per-user ms-settings open command is written, and computerdefaults.exe spawns a child (T1548.002). Q6, Q7, Q8.
  3. H3, high: a dbghelp.tmp appears in C:\Windows\Temp (T1574.001, T1074.001). Q9.
  4. H4, high: published lure, loader or hash artifacts exist on a host (T1204.002, T1036.007). Q2, Q4.
  5. H5, medium: an extension-disguised executable lands in Temp and a shortcut-launched PowerShell decodes it from a PDF (T1140, T1027.013). Q1, Q3.
  6. 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.
  7. H7, low: Edge or a Temp-resident parent runs recon utilities (T1057, T1016). Q11, Q12.

Attack chain

StepPhaseBehaviorTelemetryHunts
1DeliveryDisk 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
2ExecutionShortcut starts hidden PowerShell, shows the PDF decoy, decodes an embedded executable with an XOR key and writes %TEMP%\IfyuUapz.txt, run with cmd /cProcess creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)Q1, Q2, Q3
3LoaderNim loader decodes two Base64 blobs (Rust DLL and PowerShell deployer), runs the script hidden with an encoded command, tries loadLib then regsvr32.exeProcess creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)Q5
4StagingDLL copied to C:\Windows\Temp\dbghelp.tmpExecutable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents)Q9
5UAC bypassHKCU\Software\Classes\ms-settings\shell\open\command modified, computerdefaults.exe launched, elevated command moves the DLLRegistry 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
6SideloadDLL 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
7Recontasklist, ipconfig, screenshot; artifacts tasklist_startup.txt, network_info.txt, screenshot.pngProcess creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)Q12
8C2Registration and commands through a per-device Discord channel; public IP lookup through ipify.comDNS 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
9ExfiltrationDirectory zipped and sent with ngrok; !download returns files through DiscordProcess 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
10CleanupDeployer deletes temporary scripts, intermediate DLL and registry changesNot directly observable; the registry write (step 5) is the durable traceQ6, Q7
04

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.

TypeValueConfidenceActionContextExpiry
md52deb724a709b0b892248405323350e9bmediumdetectNim loader, listed as IfyuUapz.txt (Darktrace)2027-04-15
md5c66858718d883bcfb9ce2c19b59f96c9mediumdetectRust RAT DLL, listed as dbghelp.dll (Darktrace). Single source, so detect only; the name is stock Windows2027-04-15
md562e3e85eca78a0cd7e6669e9f33d936dmediumdetectShortcut Proposition_Projet_Personnalisable.docx.lnk (Darktrace)2027-04-15
md5eeb52cb95113a131c2c7713c17872da6mediumdetectDecoy PDF with embedded payload Presentation_Generale.pdf.pdf (Darktrace)2027-04-15
filenameProposition_Projet.imgmediumhuntDisk image container (Darktrace)2027-01-15
filenameProposition_Projet_Personnalisable.docx (.lnk)mediumhuntShortcut disguised as a Word document2027-01-15
filenamePresentation_Generale.pdf.pdfmediumhuntDouble-extension decoy PDF2027-01-15
filenameIfyuUapz.txtmediumhuntLoader written to %TEMP%; a PE disguised as text2027-01-15
pathC:\Windows\Temp\dbghelp.tmpmediumhuntDLL staging file2027-01-15
pathC:\Program Files (x86)\Microsoft\Edge\Application\dbghelp.dllmediumhuntSideload target. Name is stock, location is the signal; never block by name2027-01-15
registryHKCU\Software\Classes\ms-settings\shell\open\commandhighhuntUAC-bypass hijack key (technique shared with other campaigns)2027-01-15
filenametasklist_startup.txt, network_info.txtlowenrichRAT recon output files; screenshot.png is too generic to hunt alone2026-11-15
serviceipify.comlowenrichLegitimate public-IP service queried by the RAT at registration. Never block2026-11-15
networknone publishedn/an/aDarktrace published no Discord channel IDs, tokens, webhooks, ngrok endpoints, IPs or domains
05

Affected Surface & Telemetry Matrix

SurfaceTelemetryPriorityGap
Windows endpoints where users can mount disk images and run shortcutsProcess 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)HighImage 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)HighNone for the registry write
Microsoft Edge install directory and msedge.exeExecutable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); module load eventsHighDLL load into msedge.exe is outside the query set; use Sysmon image-load events (section 7)
Outbound Discord and ngrok trafficDNS 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)MediumMessage 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 creationMediumFile reads, screenshot capture and camera access are outside endpoint telemetry
06

ATT&CK Mapping

Technique IDs are the ones Darktrace lists; the Query column is this pack's mapping.

TacticTechniqueObserved behaviorQuery
Initial Access / ExecutionT1204.002 User Execution: Malicious FileOpening the shortcut from the mounted imageQ1, Q2
Defense EvasionT1036.007 Double File Extension; T1036.005 Match Legitimate Name or Location.pdf.pdf, .docx shortcut, dbghelp.dll in the Edge directoryQ2, Q10
ExecutionT1059.001 PowerShell; T1059.003 Windows Command ShellHidden PowerShell, cmd /c, encoded command from the loaderQ1, Q5, Q11
Defense EvasionT1027 Obfuscated Files; T1140 Deobfuscate/Decode; T1027.013 Encrypted/Encoded FileXOR-decoded payload in the PDF, Base64 blobs in the loaderQ1, Q3
Privilege EscalationT1548.002 Bypass User Account Control; T1112 Modify Registryms-settings open command and computerdefaults.exeQ6, Q7, Q8
Persistence / Defense EvasionT1574.001 DLL Search Order Hijackingdbghelp.dll beside msedge.exeQ9, Q10, Q11
Defense EvasionT1218.010 Regsvr32; T1564.003 Hidden Window; T1070.004 File DeletionFallback load, hidden windows, cleanup of scripts and registry changesQ5 (rest is a gap)
DiscoveryT1082, T1016, T1057System, network and process discovery at RAT startupQ12, Q11
CollectionT1113 Screen Capture; T1005 Data from Local System; T1074.001 Local Data Staging; T1560.001 Archive via UtilityScreenshot, file download, staged ZIPGap (see section 15)
Command and ControlT1102.002 Web Service: Bidirectional CommunicationDiscord channel per deviceQ13
ExfiltrationT1567 Exfiltration Over Web Service; T1041 Exfiltration Over C2 Channelngrok and Discord file returnQ14, Q15
07

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.exe loading dbghelp.dll from 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.tmp in 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.dll directly in the Edge Application folder, a dbghelp.tmp in Windows\Temp, and an IfyuUapz.txt in user Temp folders (the read-only audit script in section 13 does this).
08

Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL

Show all queries in
Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Every query is detect or hunt only. dbghelp.dll, computerdefaults.exe, msedge.exe and powershell.exe are stock binaries, so no query or IOC row proposes blocking them. Q13 to Q15 touch shared services (Discord, ngrok) and are process-context hunts, not indicators. Q1 and Q5 use tokens that are hypotheses about commands Darktrace shows only as screenshots; validate in your tenant.
Q1 · Shortcut-Launched PowerShell That Reads a PDF as Bytes to Decode an Embedded Executable
CONF MEDIUMFP LOWCOST LOW

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.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q2 · Published CikaBika Lure and Loader Filenames
CONF HIGHFP LOWCOST LOW

Looks for: The filenames Darktrace published (image, double-extension PDF, shortcut, Nim loader) in any process command line, parent name or file write.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptions, telemetry-gapProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q3 · Executable Written to a Temp Folder With a Document or Text Extension
CONF MEDIUMFP MEDIUMCOST LOW

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).

Validation: static-reviewedEquivalence: unsupported-without-redesignProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q4 · Published CikaBika MD5 Hashes on Execution or Write
CONF HIGHFP LOWCOST LOW

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.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptions, telemetry-gapProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q5 · regsvr32 Retrying a DLL From a User-Writable Folder
CONF LOWFP MEDIUMCOST LOW

Looks 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).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q6 · ms-settings Shell Open Command Registry Write (UAC Bypass Pattern)
CONF HIGHFP MEDIUMCOST LOW

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).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q7 · ms-settings Hijack Whose Command Moves a dbghelp File
CONF HIGHFP LOWCOST LOW

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.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q8 · computerdefaults.exe Spawning a Child Process
CONF HIGHFP LOWCOST LOW

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.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q9 · dbghelp.tmp Staged in the Windows Temp Folder
CONF HIGHFP LOWCOST LOW

Looks 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.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptions, telemetry-gapProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q10 · dbghelp.dll Written Directly Into the Edge Application Directory
CONF HIGHFP MEDIUMCOST LOW

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).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q11 · msedge.exe Spawning a Shell or Recon Utility
CONF LOWFP MEDIUMCOST LOW

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).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q12 · tasklist and ipconfig Run Under the Same Parent
CONF LOWFP MEDIUMCOST LOW

Looks 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).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: approximate-analyticProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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
Q13 · Discord Name Resolution From a Non-Browser, Non-Discord Process
CONF MEDIUMFP MEDIUMCOST MEDIUM

Looks 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).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: approximate-analytic, equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q14 · ngrok Tunnel Domain Resolution
CONF LOWFP MEDIUMCOST LOW

Looks 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).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
Q15 · ngrok Binary or CLI Invocation
CONF MEDIUMFP MEDIUMCOST LOW

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).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
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])
09

Detection Rules by Platform

CrowdStrike: Custom IOA

IOA namePattern (Process Creation / Registry / File Write, Windows)PromotesActionExclusions
ms-settings open command written with dbghelp or Edge pathRegistry value set; key matches \ms-settings\shell\open\command and value matches (?i)(dbghelp|\Microsoft\Edge\Application)Promote Q7Detect, highNone needed
computerdefaults.exe spawning a childProcess Creation; parent image .*\\computerdefaults\.exe; child not SystemSettings.exe or ApplicationFrameHost.exePromote Q8Detect, highAuthorised pen-test hosts by aid
dbghelp.dll written into the Edge Application directoryFile write; path (?i).*\\Microsoft\\Edge\\Application\\dbghelp\.dllPromote Q10Detect, high; never preventConfirm Edge servicing behavior on a clean host first
dbghelp.tmp staged in Windows TempFile write; path (?i).*\\Windows\\Temp\\dbghelp\.tmpPromote Q9Detect, highNone 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)

  1. Confirm the host and user; check whether a disk image or shortcut was opened from Downloads or mail cache.
  2. Pull the writer process and parent chain for the hit.
  3. Hash the dbghelp.dll beside msedge.exe and check signer; compare MD5 to the published value.
  4. Check for %TEMP%\IfyuUapz.txt and C:\Windows\Temp\dbghelp.tmp.
  5. Read the ms-settings key value for the user hive.
  6. Run Q13, Q14 and Q15 on the same aid for Discord and ngrok use.
  7. 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

RuleSource queryRun asNotes
ms-settings open command written with dbghelp or Edge pathQ7, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
computerdefaults.exe spawning a childQ8, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
dbghelp.dll written into the Edge Application directoryQ10, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
dbghelp.tmp staged in Windows TempQ9, PowerQuery tabScheduled custom detection ruleBind 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

RuleSource queryRun asNotes
ms-settings open command written with dbghelp or Edge pathQ7, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe 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 childQ8, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe 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 directoryQ10, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe 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 TempQ9, KQL – Defender XDR tabHunt only until the gap is closedQ9 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.

10

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.

Falcon IOC Management CSV4 rows, all detect, MD5
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
SentinelOne IOC importnot included

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 Signaturespath, registry, parent
# 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 & Toolinglabels
# 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.
Hardening & Audit Checklistread-only
# 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
11

Detection Validation Gates

GateCheckPass criteria
Telemetry readyProcess 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 baselineQ3, Q5, Q10, Q11, Q12, Q13, Q14, Q15 over 30 daysDocument installer, developer and RMM noise and add the exclusions named in each TUNING line before alerting
Positive testsOn 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.tmpQ2, Q6/Q7 and Q9 fire; remove the test artifacts afterwards. No malware is run
PromotionQ7, Q8, Q9, Q10 as Custom IOA detect rulesZero unexplained hits for 14 days or each hit triaged; no prevent action on any stock binary
Hypothesis checksQ1 and Q5 command-line tokens; Q10 location on a clean Edge hostConfirm in tenant: Darktrace shows the shortcut command only as an image
12

Hardening: Tiered & Deployable

Controls are anchored to MITRE mitigations (M-numbers) plus a platform authority. Controls with no formal benchmark are marked.

Immediate (this week)
  • Secure-desktop UAC consent for admin accounts (T1548.002, M1052 User Account Control; CIS Windows benchmark UAC settings). Setting ConsentPromptBehaviorAdmin to 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.
Near term (1 to 4 weeks, pilot first)
  • 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.
Long term (1 to 3 months)
  • 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).
13

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 SilentlyContinue
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-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 / IRContainment timestamp, host and user
Isolate: by platformCrowdStrike: 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 / IRContainment timestamp, host and user
PreserveCopy, 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.IRFile hashes, MD5 match against section 4, registry export
ScopeRun 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).SOCHit list, delivery vector
EradicateAfter 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.IRBefore and after file listing
Credentials and dataAssume 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 ownerRotation log, exfiltration estimate
RecoverReturn the host after reimage; keep Q6 to Q10 as scheduled searches for 30 days; apply the Immediate hardening tier.IT / SOCRe-hunt results at 7 and 30 days
15

Detection Coverage Map

TechniqueBehaviorCQLIOACrowdStrike coverageSentinelOneDefender XDR
T1204.002, T1036.007Image, shortcut and double-extension PDF by name and hashQ2, Q4NoneGoodGood, with assumptionsPartial: Q2 telemetry gap, Q4 telemetry gap
T1059.001, T1140, T1027.013PowerShell decoding an embedded executableQ1, Q3NonePartial (command tokens unverified)Partial: Q3 unavailablePartial: Q3 unavailable
T1548.002, T1112ms-settings hijack and computerdefaults childQ6, Q7, Q8Q7, Q8GoodGood, with assumptionsGood, with assumptions
T1574.001Staging file and DLL beside msedge.exeQ9, Q10Q9, Q10GoodGood, with assumptionsPartial: Q9 telemetry gap
T1574.001msedge.exe actually loading the DLL (module load)Q11 (indirect)NoneGAP endpoint image-load; use Sysmon Event 7GAP: same limit as CrowdStrikeGAP: same limit as CrowdStrike
T1218.010, T1564.003, T1070.004regsvr32 fallback, hidden windows, cleanupQ5NonePartialPartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
T1057, T1016, T1082Recon at startupQ11, Q12NonePartialPartial: Q12 approximatePartial: Q12 approximate
T1113, T1005, T1074.001, T1560.001Screenshot, file download, ZIP stagingNoneNoneGAP outside endpoint telemetry for screenshots and readsGAPGAP
T1102.002Discord C2Q13NonePartial process-context only; shared service, no published channel, token or IPPartial: Q13 approximatePartial: same limit as CrowdStrike
T1567, T1041ngrok and Discord file returnQ14, Q15NonePartial no endpoint published; ngrok names are analyst knowledgePartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
Honest limit: network-indicator coverage is weak. Discord and ngrok are legitimate services shared with benign users; Darktrace published no channel ID, token, webhook, tunnel endpoint, IP or domain; and TLS hides the command traffic. Detection rests on the endpoint behavioral chain, so the elevation and sideload steps carry the pack. The sideload load itself is a gap in the CQL set and Darktrace did not prove it succeeded.

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.

16

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.
17

Changelog

v0.12026-10-15Initial pack: 15 CQL hunts, 4 Falcon IOC rows (MD5, all detect), 1 source snapshot (Darktrace). Two further named sources were checked and dropped as unusable. Tiered Windows hardening, playbooks with rollback, containment runbook. SentinelOne PowerQuery and Microsoft Defender KQL tabs added to Q1-Q15: SIEM Query Rosetta release 0.1.0 (public-beta; static-reviewed translations).
18

References

TierSourceUsed forAccess date
T1Darktrace: CikaBika Bot: Inside a Discord RAT (2026-10-14)Primary analysis, all hashes, filenames, paths and ATT&CK IDs (snapshot 01)2026-10-15
RefMITRE ATT&CKTechnique IDs as listed in the Darktrace post and mitigation M-numbers2026-10-15