Nimbus Manticore: NightLedger backdoor and the BridgeHead / ArcBridge relay tunnelers

Iranian state-aligned espionage against aerospace, aviation, defence, telecom, government and financial targets across the Middle East and Africa. The implants invert the C2 direction and turn the victim endpoint into an operator relay.
Threat
Nimbus Manticore / Mirage Kitten (UNC1549)
Severity
STATE-ALIGNED ESPIONAGE
Type
Backdoor + WebSocket tunnelers
Access
Spear-phishing, fake recruitment portals
Version
v0.1 · 2026-07-29
Author
HuntPack
Confidence
HIGH
01

Executive Summary

On 2026-07-28 Kaspersky GReAT published a previously undocumented malware set attributed to Mirage Kitten, the Iranian state-aligned espionage cluster also tracked as Nimbus Manticore, GalaxyGato, Smoke Sandstorm, Subtle Snail, TA455 and UNC1549. The toolkit is three parts: NightLedger, a Windows backdoor, and two custom WebSocket tunnelers, BridgeHead and ArcBridge. The actor's objective is persistent espionage access to aerospace, aviation, defence, telecommunications, government and financial-sector networks, with confirmed victims in Egypt, Jordan, Tanzania, Pakistan, Ethiopia and Burkina Faso.

The defensively interesting part is the direction of the tunnel. BridgeHead does not dial out to fetch tasking and then act locally. It establishes one outbound HTTPS WebSocket, and from then on the C2 server initiates every tunnel connection, with the implant forwarding traffic between operator-chosen targets and the WebSocket channel. The victim workstation becomes a SOCKS5 relay node: the operator's scanning, SMB access and lateral movement all originate from inside the victim network, from a host that has a legitimate user, a legitimate IP and a legitimate reason to talk to internal servers. Every east-west artefact of the intrusion looks like the compromised employee.

That shapes the hunt. There is exactly one anomalous outbound flow per relay host and it is TLS on 443 to what looks like Azure App Service. Everything else the operator does is internal traffic sourced by a trusted host. So the highest-value detection surface is not the egress, it is the host-side loading artefacts: AppVShNotify.exe running outside its install tree and side-loading a fake SspiCli.dll, and tunneler DLLs (unbcl.dll, libwinpthread-1.dll, IPHLPAPI.dll) dropped into %LocalAppData%\Microsoft\VisualStudio or a VPN client's program directory. Those are cheap to query, low false positive, and they fire before the relay is useful.

Three properties make this actor harder than the usual commodity intrusion. Each BridgeHead binary is tailored per target: it reads the current Windows username, lowercases it, and exits silently unless a hardcoded substring is present, which means a sample pulled from one victim will not detonate in your sandbox and generic dynamic analysis produces nothing. The implant speaks enterprise proxy, handling HTTP 407 by negotiating Negotiate or NTLM with the logged-on user's SSO context, so a proxy that authenticates users does not stop it, it authenticates it. And Kaspersky note a deliberate migration away from Azure subdomain infrastructure toward Cloudflare-backed domains, so today's domain list is the most perishable part of this pack.

Defender priority: hunt the side-load and the drop paths first (Q1 through Q4). They are high-confidence, low-noise, and they catch the intrusion at the stage where it has not yet become internal traffic. Treat the domain lists as supporting evidence only. The azurewebsites.net C2 hosts sit inside a namespace your users legitimately reach all day, so a domain-only rule on that namespace is not a detection, it is a triage queue.

02

Source Review & Web Hunter Notes

TierSourceKey findingCarry forward
1 · PrimaryKaspersky Securelist (GReAT), 2026-07-28Full technical analysis. NightLedger side-load chain, mutexes, command table, both tunneler wire protocols, and the complete IOC table (10 MD5 hashes, 21 domains, 1 IP).Yes, authoritative for every atomic indicator in this pack
2 · SecondaryThe Hacker News, 2026-07-28Alias set (GalaxyGato, Subtle Snail), confirms the relay-node framing and the recruitment-lure delivery via third-party file-sharing archives. No independent indicators.Partial, narrative and aliases only
2 · SecondaryTechNadu, 2026-07-28Adds the TA455 alias and states sector targeting as aerospace, aviation, defence and telecommunications. Repeats the Kaspersky indicators.Partial, alias and sector framing only

Analyst notes and decisions

  • Single-source atomic indicators. Every hash, domain and IP in this pack traces to the Kaspersky report. The two secondary sources reproduce a subset and add nothing new, so corroboration is by republication rather than independent observation. That is normal for a first-disclosure pack, but it means confidence in the indicators should be read as "high, single primary source" and not "multi-source confirmed".
  • Kaspersky withheld part of the IOC set for Threat Intelligence Reporting customers. The published list is a subset, so absence of a match here is not absence of the actor.
  • Deliberate infrastructure migration. The report explicitly notes a shift away from Azure subdomain infrastructure toward Cloudflare-backed domains. Domain indicators are therefore short-lived. Expiry is set to three months on hunt-tier domains for that reason.
  • Hash coverage is MD5-only. No SHA256 was published. Falcon IOC Management accepts MD5, so the CSV is importable, but MD5 is trivially defeated by recompilation and this actor recompiles per target. Behaviour beats hashes here.
  • Sector framing was normalised. Kaspersky's victimology paragraph and TechNadu's sector line differ slightly in emphasis. This pack states the union of both, which is what the victim list actually supports.
  • Source integrity check. All three fetched pages were scanned for text directed at an automated agent (instructions, claimed authorisations, requests to fetch further URLs or add indicators). None was found. Matches on the string "AI agent" were unrelated headline text in the sites' own sidebars, not content addressed to a reader-agent. No source was dropped.
03

Hunt Brief & Attack Chain

Attack chain

#StepDetailTelemetryHunt angle
1Initial accessRecruitment-themed spear-phishing and fake hiring portals impersonating trusted brands, plus lookalike videoconferencing pages, redirecting to archives on third-party file-sharing services.Mail gateway, web proxy, MOTWArchive downloads from file-sharing hosts followed by execution from the download directory
2Execution via side-loadMalicious SspiCli.dll placed beside a legitimate AppVShNotify.exe. AppVShNotify imports RPCRT4.dll, which delay-loads SspiCli when an authenticating RPC API is called, so the co-located DLL loads and forwards its exports to the real one.ProcessRollup2, PeFileWrittenQ1, Q2. AppVShNotify outside its install tree, SspiCli.dll written outside system directories
3Single-instance guardNightLedger creates mutex A8215357-F99A-44FE-BC65-D8F0434B0C03; ArcBridge creates F56E68DA-4A89-46B4-9AC8-7290A7651000. Exits if already present.Memory / YARA, Custom IOAGAP No mutex telemetry in the standard Falcon event model. See s9 and s7
4C2 beaconNightLedger polls realhealthshop[.]com over HTTPS at URI /edfcvfgbhnjmkqwasderfgg, falling back to tjconsultingservices[.]com. Responses are tokenised on the delimiter (#%%#) and dispatched.DnsRequest, proxy logsQ6 plus proxy URI hunt in s7
5Collection16 commands: identity and host recon, process execution, directory and drive enumeration, file download / copy / delete, DLL loading, process and thread kill, screenshot capture, beacon-interval change, and collection of C:\Windows\debug\NetSetup.log alongside the process list.FileOpenInfo, ProcessRollup2Q10. NetSetup.log read by a non-system process
6ExfiltrationCommand output posted to /wsdefvvbnhyuijkplmbgfrtt; file upload posted to /qasxcdfvgbhnmyuioplkhnj.Proxy logs, TLS metadataProxy URI hunt in s7. Not visible to endpoint EDR alone
7Tunneler deploymentBridgeHead dropped as unbcl.dll under %LocalAppData%\Microsoft\VisualStudio, or as libwinpthread-1.dll under C:\program files (x86)\univpn\promote\. A third sample was named IPHLPAPI.dll.PeFileWritten, NewExecutableWrittenQ3, Q4. Highest-value low-noise signal in the pack
8Execution gatingResolves GetUserNameA from advapi32.dll, lowercases the username, and requires a hardcoded substring (3 characters in one observed variant). Silent exit on mismatch.Static analysis onlyGAP Anti-sandbox. Defeats generic detonation, so do not rely on sandbox verdicts
9Tunnel establishmentGET /connect WebSocket upgrade to smartconnect[.]azurewebsites[.]net with a hardcoded Chrome 86 / Edge 86 user agent. HTTP 101 completes the upgrade; a binary frame containing the literal string token authenticates. HTTP 407 triggers Negotiate then NTLM with the user's SSO context, up to 3 retries. Backoff is exponential, capped at 60s.Proxy logs, DnsRequestQ7, Q8 plus the s7 proxy hunt for a stale UA on a WebSocket upgrade
10Relay operationServer-initiated SOCKS5. Message types CONNECT, CONNECT_RESPONSE, DATA, DISCONNECT, PING (every 30s), PONG, FLOWCTRL over a fixed 8-byte-header binary format. All operator TCP traffic egresses from the victim host as if it originated there.NetworkConnectIP4Q11. Internal TCP fan-out from a single process on one workstation
11Second tunnelerArcBridge connects to aecert[.]org:443 using an embedded config block bounded by <<STARTXX>> and <<ENDXX>>, carrying implant identifier 4B8CC395-A26F-41F1-A1DC-8B993D9D41D2. Commands are OPEN: (proxy session) and DNS: (resolution).DnsRequest, YARAQ5, Q6 plus the config-block YARA idea in s9

Hunt hypotheses, ordered by fidelity

#HypothesisMITREFalcon eventsExpected FPConf
H1A legitimate AppVShNotify.exe is executing from a directory outside the App-V / Office install tree, indicating a relocated side-load host.T1574.001, T1574.002ProcessRollup2Very low. Software packagers occasionally stage App-V binaries.HIGH
H2A file named SspiCli.dll is written anywhere other than the Windows system DLL directories.T1574.001, T1036.005PeFileWrittenVery low. Servicing and WinSxS writes are excluded by path.HIGH
H3An executable file is written into %LocalAppData%\Microsoft\VisualStudio or a univpn\promote directory, the two observed BridgeHead staging paths.T1105, T1574.001PeFileWritten, NewExecutableWrittenLow. Visual Studio extension installs touch the parent tree.HIGH
H4One of the published NightLedger / BridgeHead / ArcBridge MD5 hashes appears on an endpoint.T1588.001ProcessRollup2, PeFileWrittenNone.HIGH
H5A host resolves one of the campaign's non-Azure C2 domains.T1071.001, T1568DnsRequestNone for these specific FQDNs.HIGH
H6A tunneler DLL basename (unbcl.dll, libwinpthread-1.dll, IPHLPAPI.dll) is written outside a legitimate install tree.T1036.005, T1105PeFileWrittenMedium. libwinpthread-1.dll is a genuine MinGW runtime shipped by many open-source apps; IPHLPAPI.dll is a real Windows DLL.MEDIUM
H7A non-browser process resolves an azurewebsites.net hostname, consistent with tunneler C2 hiding in legitimate Azure App Service traffic.T1090, T1102DnsRequestHigh. Line-of-business apps and installers legitimately call App Service endpoints.MEDIUM
H8C:\Windows\debug\NetSetup.log is opened by a process that is not part of the domain-join or diagnostics tooling.T1005, T1082FileOpenInfoMedium. Support tooling and inventory agents read it.MEDIUM
H9A single workstation process is sourcing internal TCP connections to an unusual breadth of internal peers and ports, the signature of relay-node operation rather than user activity.T1090.001, T1046NetworkConnectIP4Medium. Vulnerability scanners, monitoring agents and admin jump boxes look identical.MEDIUM
04

Consolidated IOC Table

All indicators below are published by Kaspersky GReAT (2026-07-28) and are traced verbatim to the saved source snapshot. Hashes are MD5; no SHA256 was published.

TypeValueConfActionContextExpiry
md5A239E655709A2518DD0B7BDBED163679highdetectNightLedger backdoor, sspicli.dll2027-01-29
md55FA15EF96808EA82F0A6176F0BB4B386highdetectArcBridge tunneler2027-01-29
md542F847597109DA2A220391BB09D00676highdetectArcBridge tunneler2027-01-29
md5AFB1C1583606599C7272CFB33CC6F498highdetectArcBridge tunneler2027-01-29
md56038D42AF0AFFD1FB263F470C0956F6BhighdetectBridgeHead, unbcl.dll2027-01-29
md5AE628EFA305387B633DCE82F9364875BhighdetectBridgeHead, unbcl.dll2027-01-29
md5F7D36CC5904A53252D2BB3D21615134FhighdetectBridgeHead, libwinpthread-1.dll2027-01-29
md5C90F0EFADBF322E5EB1C4103A38C30E6highdetectBridgeHead, libwinpthread-1.dll2027-01-29
md5D09B14A2FE01C7363ECC56F5D046162ChighdetectBridgeHead, IPHLPAPI.dll2027-01-29
md5C832ECD135781B11F59E3FFFB3D2B6AChighdetectBridgeHead variant using WSS/443 to businessmixture[.]com/blog instead of Azure2027-01-29
domainrealhealthshop[.]comhighdetectNightLedger primary C2, URI /edfcvfgbhnjmkqwasderfgg2026-10-29
domaintjconsultingservices[.]comhighdetectNightLedger fallback C22026-10-29
domainaecert[.]orghighdetectArcBridge C2, port 4432026-10-29
domainsmartconnect[.]azurewebsites[.]nethighdetectBridgeHead C2, WebSocket GET /connect2026-10-29
domainbusinessmixture[.]comhighdetectBridgeHead variant C2 over WSS/4432026-10-29
domainglobal-reds[.]comhighhuntCampaign infrastructure2026-10-29
domainmaadinglobal[.]comhighhuntCampaign infrastructure2026-10-29
domainbusiness-deegital[.]comhighhuntCampaign infrastructure, typosquat pattern2026-10-29
domainbusiness-deegital[.]azurewebsites[.]nethighhuntAzure App Service C2 host2026-10-29
domainbusinessdeegital[.]azurewebsites[.]nethighhuntAzure App Service C2 host2026-10-29
domainneexportfolio[.]comhighhuntCampaign infrastructure2026-10-29
domainneexportfolio[.]azurewebsites[.]nethighhuntAzure App Service C2 host2026-10-29
domainneexportfolio[.]eastus[.]cloudapp[.]azure[.]comhighhuntAzure cloudapp C2 host2026-10-29
domaintoadreport[.]azurewebsites[.]nethighhuntAzure App Service C2 host2026-10-29
domainhealthcarezoom-centeral[.]azurewebsites[.]nethighhuntAzure App Service C2 host, videoconference-lure naming2026-10-29
domainhealthcarezoomcenteral[.]azurewebsites[.]nethighhuntAzure App Service C2 host, videoconference-lure naming2026-10-29
domainhealthcarezoomcenteral[.]orghighhuntCampaign infrastructure, videoconference-lure naming2026-10-29
domainthehealth-life[.]comhighhuntCampaign infrastructure2026-10-29
domainbuisness-centeral-transportation[.]comhighhuntCampaign infrastructure, misspelling pattern2026-10-29
domainbusiness-startup[.]azurewebsites[.]nethighhuntAzure App Service C2 host2026-10-29
domainbusinessstartup[.]azurewebsites[.]nethighhuntAzure App Service C2 host2026-10-29
ipv4172[.]86[.]98[.]113mediumhuntCampaign infrastructure. Confirm it is not shared hosting before promoting to block2026-10-29

Non-atomic indicators (behavioural, no expiry)

TypeValueContext
mutexA8215357-F99A-44FE-BC65-D8F0434B0C03NightLedger single-instance guard
mutexF56E68DA-4A89-46B4-9AC8-7290A7651000ArcBridge single-instance guard
config id4B8CC395-A26F-41F1-A1DC-8B993D9D41D2ArcBridge embedded implant identifier, between the <<STARTXX>> and <<ENDXX>> markers
uri/edfcvfgbhnjmkqwasderfggNightLedger tasking GET
uri/wsdefvvbnhyuijkplmbgfrttNightLedger command-output POST
uri/qasxcdfvgbhnmyuioplkhnjNightLedger file-upload POST
uri/connectBridgeHead WebSocket upgrade path
delimiter(#%%#)NightLedger C2 field separator
filenameSspiCli.dll beside AppVShNotify.exeNightLedger side-load pair
path%LocalAppData%\Microsoft\VisualStudioBridgeHead staging directory (Egypt)
pathC:\program files (x86)\univpn\promote\BridgeHead staging directory (Pakistan)
user agentChrome 86 / Edg 86 string, hardcodedBridgeHead WebSocket upgrade. See the full string in s7
05

Affected Surface & Telemetry Matrix

SurfaceRequired telemetryPriorityGap risk
Windows workstations (engineering, HR, recruitment-facing staff)Falcon sensor: ProcessRollup2, PeFileWritten, NewExecutableWrittenCRITICALLow. Default sensor coverage.
Endpoint file-read visibilityFileOpenInfo on C:\Windows\debug\NetSetup.logMEDIUMHigh. File-open telemetry is configuration and licence dependent. Back it with a filesystem SACL (s7).
DNS resolutionDnsRequest, plus DNS server analytic logs for hosts without the sensorHIGHLow on managed endpoints. High for BYOD, contractors and unmanaged lab hosts.
Outbound HTTPS / proxyProxy or TLS-inspecting gateway logs with URI, Host header and User-AgentHIGHHigh. Without URI visibility the NightLedger endpoints and the GET /connect upgrade are invisible. Endpoint EDR alone cannot see them.
East-west network flowNetworkConnectIP4, or NetFlow / internal firewall logsHIGHMedium. Relay traffic is the payoff stage and is only visible if internal connections are logged.
Enterprise proxy authenticationProxy auth logs showing Negotiate / NTLM SSO from non-browser user agentsMEDIUMMedium. Many proxies do not retain the auth scheme per request.
Mail gatewayRecruitment-lure detonation, archive attachment and file-sharing link telemetryMEDIUMMedium. Lures arrive via links to third-party file-sharing services rather than attachments.
Memory / mutex artefactsCustom IOA, YARA memory scanMEDIUMHigh. No mutex event exists in the standard Falcon model. Covered only by IOA and YARA.
VPN client program directoriesPeFileWritten under third-party VPN install pathsHIGHLow, but only if the path is not excluded from sensor monitoring for performance.

Telemetry precondition. If your Falcon deployment excludes %LocalAppData% or VPN vendor directories from file-write monitoring for performance reasons, Q3 and Q4 will return nothing and it will look like a clean result. Confirm those exclusions before you trust a negative outcome from this pack.

06

ATT&CK Mapping

TacticTechniqueObserved behaviourQuery or control
Initial AccessT1566.002 Spearphishing LinkRecruitment and videoconference lures linking to archives on file-sharing servicess7 mail gateway hunt, H-2 hardening
ExecutionT1204.002 User Execution: Malicious FileVictim opens the downloaded archive and runs the bundled loaderH-1, H-3 hardening
Persistence / Priv Esc / Defense EvasionT1574.001 Hijack Execution Flow: DLLSspiCli.dll side-loaded via AppVShNotify.exe and the RPCRT4.dll delay-load pathQ1, Q2, IOA-1, H-1
Defense EvasionT1036.005 Masquerading: Match Legitimate NameImplants named SspiCli.dll, unbcl.dll, libwinpthread-1.dll, IPHLPAPI.dllQ2, Q3, IOA-2
Defense EvasionT1497.001 Virtualisation / Sandbox Evasion: System ChecksUsername substring gate via GetUserNameA, silent exit on mismatchGAP Static analysis only
DiscoveryT1082 System Information DiscoveryCommands 1 and 25: user, host and network identity collectionQ10
DiscoveryT1057 Process DiscoveryCommand 90: process listing, returned with NetSetup.logQ10
DiscoveryT1083 File and Directory DiscoveryCommands 17 and 75: directory listing and logical drive enumerationIOA-1
CollectionT1113 Screen CaptureCommand 36: screenshot captureIOA-1
CollectionT1005 Data from Local SystemCommand 93: collection of C:\Windows\debug\NetSetup.logQ10, H-6 hardening
Command and ControlT1071.001 Application Layer Protocol: WebHTTPS GET/POST beaconing to fixed high-entropy URI pathsQ6, s7 proxy hunt
Command and ControlT1102 Web ServiceC2 fronted on Azure App Service (azurewebsites.net) and Azure cloudapp hostsQ7, Q8
Command and ControlT1090.001 Internal ProxyBridgeHead and ArcBridge SOCKS5 relay, server-initiated tunnelsQ11, IOA-3
Command and ControlT1573 Encrypted ChannelWebSocket over TLS 443, binary framing inside the upgrades7 proxy hunt, H-4 hardening
Command and ControlT1008 Fallback Channelstjconsultingservices[.]com as NightLedger fallback C2Q6
Credential AccessT1187 Forced AuthenticationHTTP 407 handling that replays the user's Negotiate / NTLM SSO context to the proxyH-5 hardening, s7 proxy auth hunt
Lateral MovementT1046 Network Service DiscoveryOperator-side scanning executed through the relay, sourced from the victim hostQ11
ExfiltrationT1041 Exfiltration Over C2 ChannelFile upload POST to /qasxcdfvgbhnmyuioplkhnjs7 proxy hunt
07

Native Audit-Log Hunts (non-CQL)

The queries in s8 cover what the endpoint sensor sees. These checks cover what it does not: URI paths, WebSocket upgrades, proxy authentication and image-load events. Run them in parallel with the CQL, not after.

7.1 Proxy / TLS-inspecting gateway: NightLedger URI paths

The three NightLedger endpoints are fixed, long, and keyboard-walk random. They will not collide with anything legitimate. Search the last 90 days of proxy logs for the URI path, independent of hostname, because the C2 domain rotates but the paths have not.

URI path contains any of:
  /edfcvfgbhnjmkqwasderfgg     (tasking GET)
  /wsdefvvbnhyuijkplmbgfrtt    (command output POST)
  /qasxcdfvgbhnmyuioplkhnj     (file upload POST)

Any single hit is a confirmed NightLedger infection. Escalate immediately, do not tune.

7.2 Proxy: BridgeHead WebSocket upgrade with a hardcoded stale user agent

BridgeHead's upgrade request carries a fixed Chrome 86 / Edge 86 user agent. Chrome 86 shipped in 2020, so on a managed fleet this string on a WebSocket upgrade is anomalous on its own. Pair the Upgrade: websocket header with a user-agent major version far behind your browser baseline.

Match on the upgrade request:
  Method:      GET
  Path:        /connect
  Header:      Upgrade: websocket
  Header:      Connection: Upgrade
  User-Agent:  Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Edg/86.0.622.38

Broader, rotation-resistant variant:
  Upgrade: websocket  AND  User-Agent Chrome major version older than your fleet baseline minus 10
  Then group by client host. A managed endpoint should have zero.

7.3 Proxy: SSO authentication from a non-browser client

BridgeHead answers HTTP 407 by querying supported auth schemes, selecting Negotiate (0x10) then NTLM (0x2) in that order, and retrying up to three times with null credentials so Windows supplies the logged-on user's SSO context. Hunt for successful Negotiate or NTLM proxy authentication where the user agent is not a browser your fleet actually runs, or where three 407 retries precede a 101.

7.4 Sysmon Event ID 7 (Image Load): the side-load itself

Falcon's standard event model has no module-load event, so if Sysmon is deployed this is the most direct evidence of the NightLedger chain and it is worth running even on a partial Sysmon estate.

Sysmon EID 7 where
  ImageLoaded  ends with \SspiCli.dll
  AND ImageLoaded does NOT start with C:\Windows\System32\
  AND ImageLoaded does NOT start with C:\Windows\SysWOW64\
  AND ImageLoaded does NOT start with C:\Windows\WinSxS\

Also worth a standing rule:
  Image ends with \AppVShNotify.exe  AND  Signed = false
  Image ends with \AppVShNotify.exe  AND  ImageLoaded is unsigned

7.5 Windows: SACL audit on NetSetup.log

Endpoint file-read telemetry is unreliable (see s5). A filesystem SACL gives an independent, always-on record of who read the file. See playbook P4 for the deployment steps.

Enable: Audit Object Access (Success) via Advanced Audit Policy
Apply SACL: C:\Windows\debug\NetSetup.log, Principal Everyone, Read Data, Success
Then hunt: Security EID 4663, ObjectName = C:\Windows\debug\NetSetup.log
Exclude the process images your domain-join and support tooling actually use.

7.6 DNS server analytic logs

Covers unmanaged hosts that have no Falcon sensor. Query the resolver for the domain list in s10 rather than relying on endpoint DNS events alone. Retain hits for the full 90-day window; the actor's Azure-to-Cloudflare migration means a historical hit may be the only evidence left.

7.7 Mail gateway: the recruitment lure

Hunt inbound mail carrying links to third-party file-sharing services where the message body references a job opportunity, hiring platform, candidate assessment or a videoconference invitation, targeted at staff in aerospace, aviation, defence or telecom functions. The lures impersonate trusted brands, so brand-impersonation scoring plus a file-sharing link is the useful combination, not either alone.

08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first. Every "Open in Falcon" button below uses this selection.

No in-query time filter is used anywhere in this pack. Set the window with the Falcon console time picker. Each query records the intended lookback as a // LOOKBACK: comment. A CQL comparison cannot take an expression on its right-hand side, so an in-query @timestamp filter against now() fails to parse on line 1 and silently kills the whole query.

Q1 · AppVShNotify.exe executing outside its install tree (NightLedger side-load host)
CONF HIGHFP LOWCOST LOW

Looks for: the legitimate App-V notifier binary running from anywhere other than its Office or App-V install tree. NightLedger relies on this binary being relocated so a malicious co-located SspiCli.dll is found first. Start here. Any hit is worth a full host investigation.

// HUNT: AppVShNotify.exe running outside the App-V / Office install tree
// MITRE: T1574.001, T1574.002 | CONF: high  FP: low  COST: low
// REQUIRES: Falcon Windows sensor, ProcessRollup2
// LOOKBACK: 30d, set in the Falcon console time picker
// FALSE POSITIVES: software packaging and App-V sequencing hosts may stage this binary
// TUNING: exclude your packaging/sequencing build hosts by ComputerName, not by path
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| FileName=/^AppVShNotify\.exe$/i
| ImageFileName!=/microsoft office/i
| ImageFileName!=/microsoft application virtualization/i
| ImageFileName!=/windows\\system32/i
| table([@timestamp, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData, aid])
| sort(@timestamp, order=desc, limit=200)
Q2 · SspiCli.dll written outside the Windows system DLL directories
CONF HIGHFP LOWCOST LOW

Looks for: the NightLedger payload landing on disk. A real SspiCli.dll only ever lives under System32, SysWOW64, WinSxS or the servicing store. A copy anywhere else is a side-load plant. Matching on FileName rather than a path regex avoids escaping the path separator entirely.

// HUNT: SspiCli.dll dropped outside the Windows system DLL directories
// MITRE: T1574.001, T1036.005 | CONF: high  FP: low  COST: low
// REQUIRES: Falcon Windows sensor, PeFileWritten
// LOOKBACK: 30d, set in the Falcon console time picker
// FALSE POSITIVES: SDK and redistributable installers that stage a private copy of the DLL
// TUNING: if a build agent trips this, exclude the specific ContextBaseFileName of the installer, never the whole path
#event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/
| FileName=/^sspicli\.dll$/i
| TargetFileName!=/windows\\system32/i
| TargetFileName!=/windows\\syswow64/i
| TargetFileName!=/windows\\winsxs/i
| TargetFileName!=/windows\\servicing/i
| table([@timestamp, ComputerName, UserName, TargetFileName, ContextBaseFileName, SHA256HashData, aid])
| sort(@timestamp, order=desc, limit=200)
Q3 · BridgeHead / ArcBridge tunneler DLL basenames written outside system directories
CONF HIGHFP MEDCOST LOW

Looks for: the three observed tunneler filenames landing on disk. FP: libwinpthread-1.dll is a genuine MinGW runtime bundled by a lot of open-source Windows software (Git, GIMP, MSYS2, ffmpeg builds), and IPHLPAPI.dll is a real Windows DLL that installers sometimes stage privately. Expect noise on developer workstations and tune by the writing process, not by the filename.

// HUNT: BridgeHead / ArcBridge tunneler DLL basenames written outside system dirs
// MITRE: T1036.005, T1105 | CONF: high  FP: medium  COST: low
// REQUIRES: Falcon Windows sensor, PeFileWritten
// LOOKBACK: 30d, set in the Falcon console time picker
// FALSE POSITIVES: libwinpthread-1.dll ships with MinGW-built software; IPHLPAPI.dll is a real Windows DLL
// TUNING: exclude ContextBaseFileName of your known installers (git-installer, msys2, gimp setup, vendor updaters);
// TUNING: keep every unbcl.dll hit regardless of writer, it has no common legitimate use
#event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/
| FileName=/^(unbcl\.dll|libwinpthread-1\.dll|iphlpapi\.dll)$/i
| TargetFileName!=/windows\\system32/i
| TargetFileName!=/windows\\syswow64/i
| TargetFileName!=/windows\\winsxs/i
| table([@timestamp, ComputerName, UserName, FileName, TargetFileName, ContextBaseFileName, SHA256HashData, aid])
| sort(@timestamp, order=desc, limit=300)
Q4 · Executable written into the two observed BridgeHead staging directories
CONF HIGHFP LOWCOST LOW

Looks for: any PE written under %LocalAppData%\Microsoft\VisualStudio or a univpn\promote directory. This is filename-independent, so it survives the actor renaming the payload, which the per-target build process makes likely. Runs across both observed deployments (Egypt and Pakistan).

// HUNT: PE written into the observed BridgeHead staging directories, any filename
// MITRE: T1105, T1574.001 | CONF: high  FP: low  COST: low
// REQUIRES: Falcon Windows sensor, PeFileWritten. Confirm %LocalAppData% is not excluded from file monitoring
// LOOKBACK: 30d, set in the Falcon console time picker
// FALSE POSITIVES: Visual Studio extension and component installers write under the same parent tree
// TUNING: exclude ContextBaseFileName devenv.exe, vs_installer.exe and VSIXInstaller.exe, then review what remains
#event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/
| TargetFileName=/(appdata\\local\\microsoft\\visualstudio|univpn\\promote)/i
| table([@timestamp, ComputerName, UserName, FileName, TargetFileName, ContextBaseFileName, SHA256HashData, aid])
| sort(@timestamp, order=desc, limit=300)
Q5 · Known NightLedger / BridgeHead / ArcBridge MD5 hashes on any endpoint
CONF HIGHFP LOWCOST LOW

Looks for: all ten published MD5 hashes, across process execution and PE-write events. Zero false positives by construction. Treat a negative result as weak evidence only: the actor recompiles per target, so a fleet with no hash match may still be compromised. Run this for the historical answer, then rely on Q1 through Q4 for the current one.

// HUNT: published NightLedger / BridgeHead / ArcBridge MD5 hashes
// MITRE: T1588.001 | CONF: high  FP: low  COST: low
// REQUIRES: Falcon Windows sensor, ProcessRollup2 or PeFileWritten with MD5HashData populated
// LOOKBACK: 90d, set in the Falcon console time picker
// FALSE POSITIVES: none
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/
| MD5HashData=/^(a239e655709a2518dd0b7bdbed163679|5fa15ef96808ea82f0a6176f0bb4b386|42f847597109da2a220391bb09d00676|afb1c1583606599c7272cfb33cc6f498|6038d42af0affd1fb263f470c0956f6b|ae628efa305387b633dce82f9364875b|f7d36cc5904a53252d2bb3d21615134f|c90f0efadbf322e5eb1c4103a38c30e6|d09b14a2fe01c7363ecc56f5d046162c|c832ecd135781b11f59e3fffb3d2b6ac)$/i
| table([@timestamp, ComputerName, UserName, FileName, ImageFileName, TargetFileName, MD5HashData, aid])
| sort(@timestamp, order=desc, limit=200)
Q6 · DNS resolution of the campaign's non-Azure C2 domains
CONF HIGHFP LOWCOST LOW

Looks for: lookups of the eleven registered C2 and staging domains that are not on Azure infrastructure. These are actor-controlled FQDNs with no legitimate use, so any resolution is a finding. ContextBaseFileName tells you which process asked, which is the fastest route from a DNS hit to the implant on disk.

// HUNT: DNS resolution of Nimbus Manticore non-Azure C2 and staging domains
// MITRE: T1071.001, T1008, T1568 | CONF: high  FP: low  COST: low
// REQUIRES: Falcon Windows sensor, DnsRequest
// LOOKBACK: 90d, set in the Falcon console time picker
// FALSE POSITIVES: none for these specific FQDNs
#event_simpleName=/^(DnsRequest|SuspiciousDnsRequest)$/
| DomainName=/^(realhealthshop\.com|tjconsultingservices\.com|aecert\.org|businessmixture\.com|global-reds\.com|maadinglobal\.com|neexportfolio\.com|business-deegital\.com|thehealth-life\.com|healthcarezoomcenteral\.org|buisness-centeral-transportation\.com)$/i
| table([@timestamp, ComputerName, UserName, DomainName, ContextBaseFileName, aid])
| sort(@timestamp, order=desc, limit=300)
Q7 · DNS resolution of the campaign's Azure-hosted C2 FQDNs
CONF HIGHFP LOWCOST LOW

Looks for: the ten specific Azure App Service and cloudapp hostnames the actor registered, including the BridgeHead C2 smartconnect[.]azurewebsites[.]net. Kept separate from Q6 deliberately: these are exact FQDNs and therefore high confidence, whereas the parent azurewebsites.net namespace (Q8) is not. Do not generalise these to a wildcard rule.

// HUNT: DNS resolution of the campaign's Azure-hosted C2 FQDNs (exact hosts only)
// MITRE: T1102, T1090 | CONF: high  FP: low  COST: low
// REQUIRES: Falcon Windows sensor, DnsRequest
// LOOKBACK: 90d, set in the Falcon console time picker
// FALSE POSITIVES: none for these exact hostnames. The PARENT namespace is a different story, see Q8
#event_simpleName=/^(DnsRequest|SuspiciousDnsRequest)$/
| DomainName=/^(smartconnect|neexportfolio|toadreport|business-deegital|businessdeegital|business-startup|businessstartup|healthcarezoom-centeral|healthcarezoomcenteral)\.azurewebsites\.net$/i
| table([@timestamp, ComputerName, UserName, DomainName, ContextBaseFileName, aid])
| sort(@timestamp, order=desc, limit=300)
Q8 · Rotation-resistant: azurewebsites.net lookups from non-browser processes
CONF MEDFP HIGHCOST MED

Looks for: the tunneler's C2 pattern rather than its current hostname, so it survives infrastructure rotation. FP: high by design. Azure App Service is legitimately used by line-of-business apps, vendor updaters, telemetry SDKs and installers, so this returns real traffic in almost every estate. It is a pairing query: rank the output by rarity and correlate every candidate against Q1 through Q4 on the same host before you treat anything as a finding. A hit on its own is not evidence.

// HUNT: azurewebsites.net lookups from processes that are not browsers, ranked by rarity
// MITRE: T1102, T1090 | CONF: medium  FP: high  COST: medium
// REQUIRES: Falcon Windows sensor, DnsRequest
// LOOKBACK: 14d, set in the Falcon console time picker
// FALSE POSITIVES: LOB apps, vendor updaters, telemetry SDKs and installers all use Azure App Service
// TUNING: exclude your own App Service hostnames by DomainName first, then exclude the
// TUNING: signed vendor updaters you can account for by ContextBaseFileName. Never exclude
// TUNING: rundll32.exe, regsvr32.exe or an unsigned binary. Triage lowest Hosts count first.
#event_simpleName=/^(DnsRequest|SuspiciousDnsRequest)$/
| DomainName=/\.azurewebsites\.net$/i
| ContextBaseFileName!=/^(chrome\.exe|msedge\.exe|firefox\.exe|iexplore\.exe|msedgewebview2\.exe|brave\.exe|opera\.exe)$/i
| ContextBaseFileName!=/^(svchost\.exe|teams\.exe|outlook\.exe|onedrive\.exe|ms-teams\.exe)$/i
| groupBy([DomainName, ContextBaseFileName], function=[count(as=Lookups), count(ComputerName, distinct=true, as=Hosts)], limit=2000)
| sort(Hosts, order=asc, limit=200)
Q9 · Outbound connections to the campaign C2 IP address
CONF HIGHFP LOWCOST LOW

Looks for: any endpoint connecting to the single published campaign IP. Catches hosts whose DNS never traversed the sensor, including hardcoded-IP variants and hosts using an external resolver. Confirm the address is not shared hosting before you promote it from hunt to block.

// HUNT: outbound connections to the published Nimbus Manticore C2 IP
// MITRE: T1071.001, T1090 | CONF: high  FP: low  COST: low
// REQUIRES: Falcon Windows sensor, NetworkConnectIP4
// LOOKBACK: 90d, set in the Falcon console time picker
// FALSE POSITIVES: possible if the address is shared hosting. Verify ownership before blocking
#event_simpleName=/^NetworkConnectIP4$/
| RemoteAddressIP4=/^172\.86\.98\.113$/
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort, aid])
| sort(@timestamp, order=desc, limit=200)
Q10 · NetSetup.log opened by a process outside the domain-join toolchain
CONF MEDFP MEDCOST LOW

Looks for: NightLedger command 93, which collects C:\Windows\debug\NetSetup.log together with the process list. That log records domain and workgroup join history, so it is a compact map of the AD environment. FP: support tooling, inventory agents and IT scripts read it legitimately. ⚠ validate in tenant FileOpenInfo collection is configuration dependent; if this returns nothing at all, confirm the event is being collected before concluding the host is clean, and fall back to the SACL hunt in s7.5.

// HUNT: NetSetup.log read by a process outside the domain-join toolchain
// MITRE: T1005, T1082 | CONF: medium  FP: medium  COST: low
// REQUIRES: FileOpenInfo. Verify this event is collected in your tenant before trusting a null result
// LOOKBACK: 30d, set in the Falcon console time picker
// FALSE POSITIVES: inventory agents, RMM tooling and IT support scripts read this file legitimately
// TUNING: exclude your RMM and inventory agent by ContextBaseFileName after confirming the binary
// TUNING: is signed and on its expected path. Never exclude rundll32.exe or an unsigned writer.
#event_simpleName=/^FileOpenInfo$/
| TargetFileName=/windows\\debug\\netsetup\.log$/i
| ContextBaseFileName!=/^(svchost\.exe|netsetup\.exe|mmc\.exe|msiexec\.exe|explorer\.exe|notepad\.exe|trustedinstaller\.exe)$/i
| table([@timestamp, ComputerName, UserName, TargetFileName, ContextBaseFileName, aid])
| sort(@timestamp, order=desc, limit=200)
Q11 · Relay-node behaviour: internal TCP fan-out from a single workstation process
CONF MEDFP MEDCOST MED

Looks for: the payoff stage. Once BridgeHead is relaying, the operator's internal scanning and lateral movement all egress from the victim host, so one process on one workstation starts touching an unreasonable number of internal peers and ports. FP: vulnerability scanners, monitoring agents, backup clients, SCCM distribution points and admin jump boxes produce exactly this shape. The discriminator is the host role: this pattern is expected on a scanner and never expected on a marketing laptop. Sort ascending on peers is deliberate, so a low-and-slow relay is not buried under the scanner traffic.

// HUNT: single process sourcing broad internal TCP fan-out (SOCKS5 relay behaviour)
// MITRE: T1090.001, T1046 | CONF: medium  FP: medium  COST: medium
// REQUIRES: Falcon Windows sensor, NetworkConnectIP4 with internal destinations retained
// LOOKBACK: 7d, set in the Falcon console time picker
// FALSE POSITIVES: vulnerability scanners, monitoring and backup agents, SCCM, admin jump boxes
// TUNING: exclude scanner and management hosts by ComputerName, and nessus/qualys/rapid7 agents
// TUNING: by ContextBaseFileName. Do NOT exclude by port range, the operator picks the ports.
// TUNING: Review workstation-class hosts first, they should never appear here at all.
#event_simpleName=/^NetworkConnectIP4$/
| cidr(RemoteAddressIP4, subnet=["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"])
| groupBy([ComputerName, ContextBaseFileName, aid], function=[count(as=Conns), count(RemoteAddressIP4, distinct=true, as=Peers), count(RemotePort, distinct=true, as=Ports)], limit=5000)
| Peers > 15
| Ports > 4
| sort(Peers, order=asc, limit=200)
09

CrowdStrike Custom IOA Recommendations

Three of the hunt hypotheses are clean enough to promote from Investigate-only searches to blocking Custom IOAs. The rest stay as scheduled hunts. Deploy every IOA to a pilot host group in Detect mode first, review a full week of hits, then move to Prevent.

IOARule typePatternExclusionsAction
IOA-1 Relocated App-V notifierProcess CreationImage filename matches AppVShNotify\.exe and the grandparent path is outside the Office and App-V install treesSoftware packaging and App-V sequencing hosts, excluded by host group not by pathDetect, then Prevent after one week clean
IOA-2 System DLL name in a user-writable pathFile CreationFile written whose name matches sspicli\.dll or unbcl\.dll and whose target path is under a user profile or %LocalAppData%None for unbcl.dll. For sspicli.dll, exclude specific signed installer processes onlyPrevent. Neither name has a legitimate reason to appear in a user-writable directory
IOA-3 Write into a VPN client program directory by a non-installerFile CreationPE written under a third-party VPN vendor's Program Files (x86) tree by a process that is not the vendor's own signed installer or updaterThe vendor's signed installer and update serviceDetect. Promote to Prevent once the vendor's own update pattern is baselined

Not suitable as an IOA

  • Mutex names. A8215357-F99A-44FE-BC65-D8F0434B0C03 and F56E68DA-4A89-46B4-9AC8-7290A7651000 are excellent, uniquely identifying artefacts, but Custom IOAs cannot express a mutex condition and the standard Falcon event model carries no mutex event. Route them to a YARA memory-scan rule and to any secondary EDR or memory-forensics tooling instead.
  • ArcBridge config block. The delimiters <<STARTXX>> and <<ENDXX>> wrapping the implant identifier 4B8CC395-A26F-41F1-A1DC-8B993D9D41D2 make a strong static YARA signature. That belongs in file and memory scanning, not in an IOA.
  • Q8 (Azure namespace). Far too noisy for a blocking rule. Leave it as a scheduled hunt whose output is correlated against Q1 through Q4.
  • Q11 (relay fan-out). The signal depends on host role, which an IOA cannot reason about. Keep it as a weekly scheduled search reviewed by a human.

Scheduled search and alerting package

FieldValue
Scheduled Search nameDETECT: NightLedger side-load host (Nimbus Manticore)
DescriptionFires when AppVShNotify.exe runs outside its install tree or a rogue SspiCli.dll is written to disk, the two loading artefacts of the NightLedger backdoor. Either condition indicates an active espionage implant, not commodity malware.
ScheduleQ1, Q2, Q4: hourly. Q3, Q5, Q6, Q7, Q9: every 4 hours. Q8, Q10, Q11: daily, reviewed by a human.
Alert subject[CRITICAL] Detection: Nimbus Manticore, DLL side-load host observed
Alert bodyA Falcon hunt matched the NightLedger side-load pattern on HOST-01. This is associated with an Iranian state-aligned espionage actor that converts victim endpoints into covert network relays. Do not reimage before evidence collection. Isolate the host, preserve memory, and page the on-call IR lead. Escalation path: SOC L1 to IR lead within 15 minutes, no L2 triage step.

Triage checklist (L1, in order)

  1. Confirm the hit is not from a known packaging or sequencing host. If it is, close as expected and add the host group to the IOA exclusion.
  2. Network-contain the host in Falcon. Do not power it off, and do not reimage. Memory is the only place the mutex and the decoded config exist.
  3. Pull the full directory listing of the path where AppVShNotify.exe ran. Look for a co-located SspiCli.dll. Hash it and compare against the s10 MD5 list.
  4. Run Q5 fleet-wide against the collected hash. Per-target compilation means a new hash is likely, so also run Q3 and Q4 fleet-wide for the filenames and paths.
  5. Run Q6, Q7 and Q9 scoped to the affected host, then fleet-wide. Any C2 domain hit confirms the infection and gives you the campaign phase.
  6. Check the host's outbound proxy log for the three NightLedger URI paths and for a GET /connect WebSocket upgrade (s7.1, s7.2).
  7. Run Q11 scoped to the affected host over 30 days. If it shows internal fan-out, the relay was operational and the blast radius is every internal system it touched, not just this host.
  8. Assume credential compromise for the logged-on user. Reset the password and revoke sessions and Kerberos tickets. The implant replays that user's SSO context to the proxy by design.

Pivot queries

  • Host-scoped: add | ComputerName=/^HOST-01$/i to Q6, Q9 and Q11 to build the single-host timeline.
  • Sibling-host: take every internal peer address from Q11 output and run Q1 through Q4 against those hosts. The relay's targets are the actor's next foothold.
  • Same-writer: take the ContextBaseFileName from a Q2 or Q3 hit and search fleet-wide for every other file that process has written. That is the dropper's full inventory.
10

Machine-Readable IOC Appendix

Every atomic indicator below is published by Kaspersky GReAT (2026-07-28) and traces verbatim to the saved source snapshot. Import the CSV into Falcon IOC Management, then deploy the behavioural signatures, which are what will still be working after the actor's infrastructure rotates.

Falcon IOC Management CSVbulk import
type,value,action,severity,expiration,description,tags
md5,A239E655709A2518DD0B7BDBED163679,prevent,critical,2027-01-29,NightLedger backdoor sspicli.dll,campaign:NimbusManticore
md5,5FA15EF96808EA82F0A6176F0BB4B386,prevent,critical,2027-01-29,ArcBridge WebSocket tunneler,campaign:NimbusManticore
md5,42F847597109DA2A220391BB09D00676,prevent,critical,2027-01-29,ArcBridge WebSocket tunneler,campaign:NimbusManticore
md5,AFB1C1583606599C7272CFB33CC6F498,prevent,critical,2027-01-29,ArcBridge WebSocket tunneler,campaign:NimbusManticore
md5,6038D42AF0AFFD1FB263F470C0956F6B,prevent,critical,2027-01-29,BridgeHead tunneler unbcl.dll,campaign:NimbusManticore
md5,AE628EFA305387B633DCE82F9364875B,prevent,critical,2027-01-29,BridgeHead tunneler unbcl.dll,campaign:NimbusManticore
md5,F7D36CC5904A53252D2BB3D21615134F,prevent,critical,2027-01-29,BridgeHead tunneler libwinpthread-1.dll,campaign:NimbusManticore
md5,C90F0EFADBF322E5EB1C4103A38C30E6,prevent,critical,2027-01-29,BridgeHead tunneler libwinpthread-1.dll,campaign:NimbusManticore
md5,D09B14A2FE01C7363ECC56F5D046162C,prevent,critical,2027-01-29,BridgeHead tunneler IPHLPAPI.dll,campaign:NimbusManticore
md5,C832ECD135781B11F59E3FFFB3D2B6AC,prevent,critical,2027-01-29,BridgeHead variant WSS 443 non-Azure C2,campaign:NimbusManticore
domain,realhealthshop.com,detect,high,2026-10-29,NightLedger primary C2,campaign:NimbusManticore
domain,tjconsultingservices.com,detect,high,2026-10-29,NightLedger fallback C2,campaign:NimbusManticore
domain,aecert.org,detect,high,2026-10-29,ArcBridge C2 port 443,campaign:NimbusManticore
domain,smartconnect.azurewebsites.net,detect,high,2026-10-29,BridgeHead C2 WebSocket upgrade,campaign:NimbusManticore
domain,businessmixture.com,detect,high,2026-10-29,BridgeHead variant C2 over WSS,campaign:NimbusManticore
domain,global-reds.com,detect,high,2026-10-29,Campaign infrastructure,campaign:NimbusManticore
domain,maadinglobal.com,detect,high,2026-10-29,Campaign infrastructure,campaign:NimbusManticore
domain,business-deegital.com,detect,high,2026-10-29,Campaign infrastructure,campaign:NimbusManticore
domain,business-deegital.azurewebsites.net,detect,high,2026-10-29,Azure App Service C2 host,campaign:NimbusManticore
domain,businessdeegital.azurewebsites.net,detect,high,2026-10-29,Azure App Service C2 host,campaign:NimbusManticore
domain,neexportfolio.com,detect,high,2026-10-29,Campaign infrastructure,campaign:NimbusManticore
domain,neexportfolio.azurewebsites.net,detect,high,2026-10-29,Azure App Service C2 host,campaign:NimbusManticore
domain,neexportfolio.eastus.cloudapp.azure.com,detect,high,2026-10-29,Azure cloudapp C2 host,campaign:NimbusManticore
domain,toadreport.azurewebsites.net,detect,high,2026-10-29,Azure App Service C2 host,campaign:NimbusManticore
domain,healthcarezoom-centeral.azurewebsites.net,detect,high,2026-10-29,Azure App Service C2 host,campaign:NimbusManticore
domain,healthcarezoomcenteral.azurewebsites.net,detect,high,2026-10-29,Azure App Service C2 host,campaign:NimbusManticore
domain,healthcarezoomcenteral.org,detect,high,2026-10-29,Campaign infrastructure,campaign:NimbusManticore
domain,thehealth-life.com,detect,high,2026-10-29,Campaign infrastructure,campaign:NimbusManticore
domain,buisness-centeral-transportation.com,detect,high,2026-10-29,Campaign infrastructure,campaign:NimbusManticore
domain,business-startup.azurewebsites.net,detect,high,2026-10-29,Azure App Service C2 host,campaign:NimbusManticore
domain,businessstartup.azurewebsites.net,detect,high,2026-10-29,Azure App Service C2 host,campaign:NimbusManticore
ipv4,172.86.98.113,detect,high,2026-10-29,Campaign infrastructure verify not shared hosting before block,campaign:NimbusManticore
Behavioural signaturessurvives rotation
# These outlive the hashes and domains. Deploy them first.

SIDE-LOAD PAIR
  AppVShNotify.exe executing outside the Office / App-V install tree
  SspiCli.dll present in the same directory as AppVShNotify.exe
  SspiCli.dll anywhere other than System32 / SysWOW64 / WinSxS / servicing

TUNNELER STAGING PATHS
  Any PE written under %LocalAppData%\Microsoft\VisualStudio
  Any PE written under a VPN vendor path ending in \promote\
  DLL basenames: unbcl.dll, libwinpthread-1.dll, IPHLPAPI.dll outside system dirs

C2 SHAPE
  HTTP GET to a 20+ character keyboard-walk URI path with no query string
  WebSocket upgrade: GET /connect with Upgrade: websocket
  Hardcoded Chrome 86 / Edg 86 user agent on a WebSocket upgrade
  Three HTTP 407 retries with Negotiate then NTLM, then HTTP 101
  Binary WebSocket frame containing the literal string "token" as first message
  PING keepalive at a fixed 30 second interval over a TLS 443 WebSocket

RELAY BEHAVIOUR
  A workstation-class host sourcing internal TCP connections to many peers/ports
  Inbound-initiated tunnel setup: outbound flow stays open, internal fan-out follows
  Internal connection breadth that starts abruptly with no software-deployment cause

COLLECTION
  C:\Windows\debug\NetSetup.log read by a process outside the domain-join toolchain
  Screenshot capture by a process with no UI and no user interaction
Named tooling, mutexes & configYARA / memory scan
# Not importable as Falcon IOCs. Route to YARA and memory forensics.

MUTEXES (single-instance guards)
  A8215357-F99A-44FE-BC65-D8F0434B0C03    NightLedger
  F56E68DA-4A89-46B4-9AC8-7290A7651000    ArcBridge

ARCBRIDGE EMBEDDED CONFIG
  Delimiters:  <<STARTXX>>  ...  <<ENDXX>>
  Implant id:  4B8CC395-A26F-41F1-A1DC-8B993D9D41D2
  Fields:      C2 host, C2 port, retry/timeout ms, SSL flag, implant id
  Commands:    OPEN:   creates a proxy/tunnel session
               DNS:    resolves a hostname and returns the result

NIGHTLEDGER C2 PROTOCOL
  Field delimiter:  (#%%#)
  Tasking GET:      /edfcvfgbhnjmkqwasderfgg
  Output POST:      /wsdefvvbnhyuijkplmbgfrtt
  Upload POST:      /qasxcdfvgbhnmyuioplkhnj

BRIDGEHEAD WIRE FORMAT (8 byte header, then payload)
  offset 0  size 1    type      message type 1-9
  offset 1  size 4    connId    tunnel connection identifier
  offset 5  size 1    flags     status or error indicator
  offset 6  size 2    dataLen   payload length
  Types: 1 CONNECT, 2 CONNECT_RESPONSE, 3 DATA, 4 DISCONNECT,
         5 PING, 6 PONG, 9 FLOWCTRL

RELATED TOOLING (same actor, prior reporting)
  NightLedger is functionally close to TWOSTROKE
  BridgeHead proxy logic mirrors Retrograde / MiniFast / MiniUpdate
  Earlier tunnelers: LIGHTRAIL, POLLBLEND

ALIASES
  Nimbus Manticore, Mirage Kitten, GalaxyGato, Smoke Sandstorm,
  Subtle Snail, TA455, UNC1549
Control audit checklistverify before you hunt
# Run these before trusting any negative result from this pack.

TELEMETRY
  [ ] %LocalAppData% is NOT excluded from Falcon file-write monitoring
  [ ] Third-party VPN program directories are NOT excluded
  [ ] FileOpenInfo is being collected (else Q10 returns a false clean)
  [ ] NetworkConnectIP4 retains RFC1918 destinations (else Q11 is blind)
  [ ] Proxy logs retain URI path, Host header and User-Agent for 90 days

ENDPOINT CONTROLS
  [ ] SafeDllSearchMode = 1 in Session Manager
  [ ] CWDIllegalInDllSearch set to remove CWD from the DLL search order
  [ ] WDAC or AppLocker DLL rules block DLL load from user-writable paths
  [ ] ASR: block executable content from email client and webmail
  [ ] Mark-of-the-Web preserved through the archive tools in use
  [ ] Mounting of ISO/VHD/VHDX by standard users is blocked

NETWORK CONTROLS
  [ ] Outbound 443 requires the authenticated proxy, no direct egress
  [ ] WebSocket upgrades through the proxy are logged and reviewable
  [ ] Newly registered / low reputation domain categories are blocked
  [ ] Workstation-to-workstation internal traffic is restricted or logged

IDENTITY
  [ ] NTLM outbound restricted; Negotiate preferred and audited
  [ ] Extended Protection for Authentication enabled on the proxy
  [ ] Domain-join / support accounts cannot log on to workstations interactively
11

Detection Validation Gates

Work these four gates in order. A query that has not cleared gate 2 should not be scheduled, and a query that has not cleared gate 3 should never be promoted to Prevent.

GateWhat to proveHowPass criteria
1 · Telemetry readyThe events each query depends on are actually arriving.Run #event_simpleName=/^PeFileWritten$/ | groupBy([ComputerName], limit=100) and the equivalent for ProcessRollup2, DnsRequest, NetworkConnectIP4 and FileOpenInfo over 24 hours.Every event type returns a host count consistent with your fleet size. FileOpenInfo returning zero means Q10 is blind, not clean.
2 · Benign baselineThe query's normal-state volume is known before it alerts on anything.Run each query over 30 days with no exclusions and record the hit count and the distinct-host count.Q1, Q2, Q4, Q5, Q6, Q7, Q9 should return zero or a handful of explainable hits. Q3, Q8, Q10, Q11 will return volume: that is the baseline you tune against, and the tuning goes in the // TUNING: line, not in a mental note.
3 · Positive testThe query fires on the behaviour, not just on the sample.On an isolated lab host: copy a benign signed AppVShNotify.exe to C:\Users\Public\test\ and run it (tests Q1). Write a benign renamed DLL as SspiCli.dll to a user directory (Q2) and as unbcl.dll (Q3). Write any benign PE under %LocalAppData%\Microsoft\VisualStudio\lab\ (Q4). Add one campaign domain to the lab host's hosts file and resolve it (Q6, Q7). Read NetSetup.log with a renamed copy of a benign binary (Q10).Each query returns the lab host within its scheduled interval. No malicious code is required or used for any of these tests.
4 · PromotionThe rule is safe to block with.Run the IOA in Detect mode on a pilot host group for 7 days, then review every hit individually.Zero unexplained detections across the pilot week. Only IOA-2 is recommended to go straight to Prevent, because neither unbcl.dll nor a relocated sspicli.dll has a legitimate reason to exist in a user-writable path.

Do not detonate live samples to validate. Each BridgeHead build gates on a hardcoded substring of the target's Windows username and exits silently on mismatch, so a live sample will do nothing in your lab and you will conclude, wrongly, that your detections do not work. Use the benign file and process placements in gate 3 instead: they exercise exactly the same telemetry paths.

12

Hardening: Tiered

Immediate · deploy this week · no compatibility risk

H-1 · Close the DLL search-order hole (MITRE M1044, M1038)

NightLedger depends entirely on a co-located DLL being found before the system copy. Two registry settings shrink that window fleet-wide with no user-visible change. Set SafeDllSearchMode to 1 under HKLM\SYSTEM\CurrentControlSet\Control\Session Manager, and set CWDIllegalInDllSearch to 0xFFFFFFFF to remove the current working directory from the search order entirely. Authority: Microsoft dynamic-link library security guidance; CIS Microsoft Windows Benchmark, Session Manager settings. Verify: Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name SafeDllSearchMode.

⚠ note CWDIllegalInDllSearch at 0xFFFFFFFF can break legacy applications that deliberately load a DLL from the working directory. Pilot on one ring first. This is the one Immediate control with a real compatibility tail.

H-2 · Block the delivery path (MITRE M1050, M1021)

The lures link to archives on third-party file-sharing services. Block or force-warn the file-sharing categories your business does not use, block newly registered and low-reputation domain categories at the proxy, and enable the Microsoft Defender ASR rule "Block executable content from email client and webmail" (BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550) in Block mode. Authority: MITRE M1021 Restrict Web-Based Content; Microsoft ASR rules reference. Verify: Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids.

H-3 · Preserve Mark-of-the-Web and stop archive laundering (MITRE M1040)

The delivery is an archive from a file-sharing site, and the standard evasion is an archive tool that strips the Mark-of-the-Web from extracted contents. Standardise on an archive tool that propagates MOTW, and enable the ASR rules "Block executable files from running unless they meet a prevalence, age, or trusted list criterion" (01443614-cd74-433a-b99e-2ecdc07bfc25) and "Block JavaScript or VBScript from launching downloaded executable content" (D3E037E1-3EB8-44C8-A917-57927947596D). Also block standard users from mounting ISO, VHD and VHDX images, a common way to deliver a side-load pair with no MOTW at all. Authority: MITRE M1040 Behavior Prevention on Endpoint.

H-4 · Force all egress through the inspecting proxy (MITRE M1037)

BridgeHead's entire C2 is one outbound TLS 443 WebSocket. If workstations can reach the internet directly on 443, none of the s7 proxy hunts will ever have data. Block direct outbound 443 from workstation VLANs at the firewall, require the authenticated explicit proxy, and ensure the proxy logs and retains the URI path, Host header, User-Agent and any Upgrade: websocket header for at least 90 days. Authority: MITRE M1037 Filter Network Traffic; NIST SP 800-41r1.

Near term · 1 to 4 weeks · pilot on a ring first

H-5 · Stop the implant borrowing the user's proxy credentials (MITRE M1027, M1035)

BridgeHead answers HTTP 407 by selecting Negotiate then NTLM and retrying with null credentials so Windows silently supplies the logged-on user's SSO context. The proxy then authenticates the malware as the user. Restrict outbound NTLM with the "Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers" policy set to Audit first and then Deny, enable Extended Protection for Authentication on the proxy, and alert on successful proxy authentication where the client user agent is not a browser your fleet runs. Authority: MITRE M1027; CIS Microsoft Windows Benchmark, Network Security section; Microsoft Extended Protection guidance. Verify: gpresult /h report.html and review the Network Security node.

H-6 · Reduce and audit the value of NetSetup.log (MITRE M1041, M1047)

NightLedger command 93 collects C:\Windows\debug\NetSetup.log because it is a compact history of domain-join operations and therefore a free map of the AD environment. The file cannot be removed without breaking diagnostics, so audit it instead: enable Advanced Audit Policy "Audit Object Access (Success)" and apply a read SACL to the file, then alert on Security Event ID 4663 from any process outside the known toolchain. See playbook P4. Authority: MITRE M1047 Audit; DISA Windows STIG audit requirements.

H-7 · Segment workstation-to-workstation traffic (MITRE M1030)

The relay's value is that it can reach internal systems from a trusted host. Host firewall policy that denies inbound workstation-to-workstation connections, plus VLAN segmentation that keeps user endpoints off server management ranges, removes most of what the operator gains from a relay foothold and makes Q11 dramatically quieter at the same time. Authority: MITRE M1030 Network Segmentation; CIS Controls v8 Control 12.

H-8 · Application control for DLLs in user-writable paths (MITRE M1038)

Every implant in this toolkit loads as a DLL from a user-writable directory. WDAC in audit mode, or AppLocker with DLL rules enabled, denies exactly that. Start in audit, collect a full business cycle of events, then enforce. Note that AppLocker DLL rules carry a measurable performance cost, which is why this is Near term and not Immediate. Authority: MITRE M1038 Execution Prevention; Microsoft WDAC design guide; CIS Microsoft Windows Benchmark.

Strategic · 1 to 3 months · architectural

H-9 · TLS inspection on workstation egress (MITRE M1037, M1057)

Without inspection, the NightLedger URI paths and the GET /connect upgrade are invisible no matter how good the endpoint coverage is, because the payload is inside TLS. Deploy inspection for workstation traffic with a documented exemption list for privacy-sensitive and certificate-pinned categories. This needs legal, HR and works-council review in most jurisdictions, which is why it is Strategic. Authority: NIST SP 800-52r2; MITRE M1057 Data Loss Prevention.

H-10 · Constrain the third-party VPN client footprint (MITRE M1051, M1033)

One BridgeHead deployment lived in a VPN vendor's Program Files (x86) tree, which is a directory most monitoring treats as trusted and some file-monitoring configurations exclude outright. Inventory every third-party VPN and remote-access client in the estate, remove the ones no longer required, and for those that remain confirm the install directory is not excluded from EDR file monitoring and that its ACLs do not permit non-administrator writes. Authority: MITRE M1051 Update Software; CIS Controls v8 Control 2.

H-11 · Treat recruitment-themed social engineering as a named risk (MITRE M1017)

This actor's access route is a person being offered a job. Generic phishing training does not cover it, because the lure is personally relevant, well researched, and arrives on the channel the target expects it on. Run targeted awareness for staff in aerospace, aviation, defence, telecom and engineering functions specifically covering fake recruiter approaches, hiring-platform impersonation, candidate "assessment" downloads and lookalike videoconference invitations, and give them a low-friction way to report one. Authority: MITRE M1017 User Training; CIS Controls v8 Control 14.

13

Deployable Playbooks

Raw configuration for the highest-leverage controls. Every step carries its prerequisites, reboot requirement and rollback. Test each on a pilot ring before fleet deployment.

P1 · Harden the DLL search order (H-1)

Prerequisites: Local administrator or SYSTEM. Applies to Windows 10, Windows 11 and Windows Server 2016 and later. Pilot ring of at least 20 hosts covering your legacy line-of-business applications.
Reboot required: Yes. Both values are read at session-manager initialisation, so they take effect on the next boot.
Rollback: Set SafeDllSearchMode back to 0 and delete the CWDIllegalInDllSearch value, then reboot. If a legacy application breaks, roll back CWDIllegalInDllSearch first and keep SafeDllSearchMode, which is the safer half and rarely breaks anything.

$key = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager'

# Capture current state for rollback BEFORE changing anything
Get-ItemProperty $key -Name SafeDllSearchMode,CWDIllegalInDllSearch -ErrorAction SilentlyContinue |
    Export-Clixml -Path C:\Windows\Temp\dllsearch-rollback.xml

# Prefer system directories over the application directory in the DLL search order
New-ItemProperty -Path $key -Name 'SafeDllSearchMode' -Value 1 -PropertyType DWord -Force

# Remove the current working directory from the DLL search order entirely
New-ItemProperty -Path $key -Name 'CWDIllegalInDllSearch' -Value 0xFFFFFFFF -PropertyType DWord -Force

# Verify (values apply after the next reboot)
Get-ItemProperty $key -Name SafeDllSearchMode,CWDIllegalInDllSearch

# ROLLBACK
# Set-ItemProperty -Path $key -Name 'SafeDllSearchMode' -Value 0
# Remove-ItemProperty -Path $key -Name 'CWDIllegalInDllSearch' -ErrorAction SilentlyContinue
# Restart-Computer

P2 · Enable the delivery-path ASR rules (H-2, H-3)

Prerequisites: Microsoft Defender Antivirus in active mode with real-time protection on. Defender for Endpoint licensing is not required for ASR, but reporting is much better with it. Run in AuditMode for one full business cycle before enabling.
Reboot required: No. Rules apply immediately.
Rollback: Re-run the same command with -AttackSurfaceReductionRules_Actions Disabled for the specific rule GUID, or AuditMode to keep visibility without blocking. Rollback is immediate and needs no reboot.

# Step 1: audit first. Collect one business cycle, then review Event ID 1122 (audit) in
# Microsoft-Windows-Windows Defender/Operational before switching to Enabled.
Add-MpPreference -AttackSurfaceReductionRules_Ids `
    BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550, `
    01443614-cd74-433a-b99e-2ecdc07bfc25, `
    D3E037E1-3EB8-44C8-A917-57927947596D `
  -AttackSurfaceReductionRules_Actions AuditMode,AuditMode,AuditMode

# Step 2: after the audit window is clean, enable enforcement
Add-MpPreference -AttackSurfaceReductionRules_Ids `
    BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550, `
    01443614-cd74-433a-b99e-2ecdc07bfc25, `
    D3E037E1-3EB8-44C8-A917-57927947596D `
  -AttackSurfaceReductionRules_Actions Enabled,Enabled,Enabled

# Verify
Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids
Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Actions

# ROLLBACK (per rule, immediate, no reboot)
# Add-MpPreference -AttackSurfaceReductionRules_Ids BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550 `
#   -AttackSurfaceReductionRules_Actions Disabled

P3 · Restrict outbound NTLM and stop SSO relay to the proxy (H-5)

Prerequisites: Domain administrator for the GPO. A complete inventory of applications that rely on outbound NTLM, which the audit step below produces. Do not skip the audit phase: going straight to Deny will break line-of-business applications that authenticate to non-domain servers.
Reboot required: No, but a Group Policy refresh (gpupdate /force) and a new logon session are needed for the policy to take effect for a user.
Rollback: Set the policy back to Allow all (value 0) and run gpupdate /force. Effect is immediate for new authentication attempts. Keep the audit-phase exception list so a re-enablement does not have to rediscover it.

# PHASE 1 - AUDIT (deploy this first, collect for at least one full business cycle)
# GPO path: Computer Configuration > Policies > Windows Settings > Security Settings >
#           Local Policies > Security Options
#   "Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers" = Audit all
#   "Network security: Restrict NTLM: Audit Incoming NTLM Traffic"             = Enable auditing for all accounts
#
# Registry equivalent:
$lsa = 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0'
New-ItemProperty -Path $lsa -Name 'RestrictSendingNTLMTraffic' -Value 1 -PropertyType DWord -Force  # 1 = Audit

# Review: Microsoft-Windows-NTLM/Operational, Event IDs 8001, 8002, 8003
# Build the exception list from those events using
#   "Network security: Restrict NTLM: Add remote server exceptions for NTLM authentication"

# PHASE 2 - ENFORCE (only after the exception list is complete and stable)
Set-ItemProperty -Path $lsa -Name 'RestrictSendingNTLMTraffic' -Value 2                             # 2 = Deny all

# Verify
Get-ItemProperty -Path $lsa -Name RestrictSendingNTLMTraffic
gpresult /h C:\Windows\Temp\gpo-report.html

# ROLLBACK (immediate for new authentications)
# Set-ItemProperty -Path $lsa -Name 'RestrictSendingNTLMTraffic' -Value 0   # 0 = Allow all
# gpupdate /force

P4 · Audit reads of NetSetup.log (H-6)

Prerequisites: Local administrator. Security event log sized to at least 1 GB, or forwarding to the SIEM already in place. Confirm your SIEM ingests Security Event ID 4663 before enabling, or the audit trail lands only in the local log.
Reboot required: No. Audit policy and SACL changes take effect immediately.
Rollback: Remove the audit rule from the file ACL and set the subcategory back to /success:disable. Immediate, no reboot. Rollback is worth doing if event volume is unexpectedly high, since object-access auditing applied too broadly can flood the Security log.

$file = 'C:\Windows\debug\NetSetup.log'

# 1. Enable the audit subcategory (object access is off by default)
auditpol /set /subcategory:"File System" /success:enable

# 2. Add a read SACL for Everyone on the target file only.
#    Scope is deliberately one file. A directory-wide SACL floods the Security log.
$acl  = Get-Acl -Path $file -Audit
$rule = New-Object System.Security.AccessControl.FileSystemAuditRule(
            'Everyone', 'ReadData', 'None', 'None', 'Success')
$acl.AddAuditRule($rule)
Set-Acl -Path $file -AclObject $acl

# 3. Verify the SACL is present
(Get-Acl -Path $file -Audit).Audit

# 4. Hunt: Security Event ID 4663 where ObjectName is the file above.
#    Exclude the process images your domain-join and support tooling legitimately use.
Get-WinEvent -FilterHashtable @{ LogName='Security'; Id=4663 } -MaxEvents 200 |
    Where-Object { $_.Message -match 'NetSetup\.log' } |
    Select-Object TimeCreated, Message

# ROLLBACK (immediate)
# $acl = Get-Acl -Path $file -Audit
# $acl.RemoveAuditRuleAll($rule)
# Set-Acl -Path $file -AclObject $acl
# auditpol /set /subcategory:"File System" /success:disable

P5 · Block direct workstation egress on 443 (H-4)

Prerequisites: The authenticated explicit proxy must already be deployed, reachable and configured via PAC or WPAD on every workstation. Confirm proxy reachability from the pilot ring before applying, or you will take those hosts offline.
Reboot required: No. Firewall rules apply immediately.
Rollback: Disable or delete the rule. Immediate. Because the failure mode here is total loss of internet access for the affected hosts, deploy to a single small ring first and keep an out-of-band management path to those hosts.

# Host-level backstop. The authoritative control belongs on the perimeter firewall;
# this rule catches hosts that bypass the proxy or roam off-network.

$proxy = '10.10.10.10'   # REPLACE with your proxy address or subnet

# Allow the proxy explicitly, first
New-NetFirewallRule -DisplayName 'Allow 443 to corporate proxy' `
  -Direction Outbound -Action Allow -Protocol TCP -RemotePort 443 `
  -RemoteAddress $proxy -Profile Domain,Private,Public

# Then deny everything else on 443
New-NetFirewallRule -DisplayName 'Block direct outbound 443 (proxy bypass)' `
  -Direction Outbound -Action Block -Protocol TCP -RemotePort 443 `
  -Profile Domain,Private,Public

# Verify
Get-NetFirewallRule -DisplayName 'Block direct outbound 443 (proxy bypass)' |
    Get-NetFirewallPortFilter

# ROLLBACK (immediate)
# Remove-NetFirewallRule -DisplayName 'Block direct outbound 443 (proxy bypass)'
# Remove-NetFirewallRule -DisplayName 'Allow 443 to corporate proxy'
14

Containment Runbook

Before anything else: do not reimage, and do not power the host off. The mutex, the decoded ArcBridge config and the tunnel state exist only in memory. A relay host is also the single best source of evidence for where the operator went next, and reimaging destroys that. Network-contain it in Falcon and leave it running.

PhaseActionsOwnerEvidence to preserve
0 · Triage
0 to 15 min
Confirm the hit is not a known packaging or sequencing host. Classify: side-load artefact (Q1, Q2) means NightLedger; tunneler drop (Q3, Q4) means the relay may already be live. Page the IR lead directly, with no L2 step.SOC L1The triggering detection, the full query output, and the host's role and owner
1 · Isolate
15 to 30 min
Network-contain the host in Falcon, leaving the sensor channel open. Do not power off, do not reimage, do not run antivirus remediation. If the host is a laptop, contain rather than asking the user to disconnect, so you keep sensor visibility.IR leadFull memory image, then a disk image. Memory first, it is the perishable one
2 · Scope by artefact
30 to 90 min
Run Q1 through Q5 fleet-wide. Take the hash of anything found and re-run Q5 with it added. Run Q6, Q7 and Q9 fleet-wide across the full 90 days. Search the proxy for the three NightLedger URI paths and for GET /connect upgrades (s7.1, s7.2).Hunt teamEvery matching host, with first-seen timestamps. First-seen is what dates the intrusion
3 · Scope the relay
1 to 4 h
Run Q11 against the affected host over 30 days. Every internal peer it contacted is a candidate second victim: run Q1 through Q4 against each one. This is the step most likely to reveal that the intrusion is far larger than the initial hit suggested, and skipping it is how a relay compromise gets closed as a single-host incident.Hunt teamThe full internal peer and port list, with timestamps, mapped to system owners
4 · Credential response
1 to 4 h
Reset the password for every user who was logged on to an affected host, revoke Kerberos tickets and active sessions, and reset any service account whose credentials were resident. The implant deliberately borrows the logged-on user's SSO context for proxy authentication, so treat that identity as compromised regardless of whether credential theft was directly observed.Identity teamAccount list, reset timestamps, and any sign-in anomalies in the preceding 90 days
5 · Block
2 to 6 h
Import the s10 CSV into Falcon IOC Management. Sinkhole or block the domain list at DNS and at the proxy. Block 172[.]86[.]98[.]113 at the perimeter after confirming it is not shared hosting. Deploy IOA-2 in Prevent mode fleet-wide.Network + SOCBlock-list change records, and any hits observed after the block goes in
6 · Eradicate
4 to 24 h
Only after imaging and scoping are complete: rebuild affected hosts from known-good media. Do not clean in place. The side-load pair is trivial to re-establish and the actor tailors each build, so a cleaned host cannot be certified. Rebuild, do not remediate.Endpoint teamRebuild record per host, tied to the incident ID
7 · Recover and harden
1 to 7 d
Return hosts to service on a rebuilt image with H-1, H-2, H-3 and H-4 already applied. Schedule the s8 queries permanently rather than running them once. Start the Near-term hardening tier, prioritising H-5 given the observed proxy-credential abuse.Endpoint + platformHardening deployment record, and the scheduled-search configuration
8 · Report
1 to 14 d
Espionage targeting of aerospace, aviation, defence, telecom, government or financial entities frequently carries sector regulatory and national-CERT notification duties. Establish the applicable obligations early rather than at day 13. Share indicators with the relevant sector ISAC.IR lead + legalTimeline, scope statement, and the indicator set shared externally
15

Detection Coverage Map

TechniqueBehaviourCQLIOACoverage
T1566.002Recruitment-lure spearphishing link to a file-sharing archivenonenoneGAP Mail gateway only (s7.7). Endpoint telemetry starts after the download
T1204.002User runs the archived loaderQ4IOA-3Partial Caught at the write, not at the click
T1574.001SspiCli.dll side-load via AppVShNotify.exeQ1, Q2IOA-1, IOA-2Good Both the loader host and the payload write are covered
T1036.005Tunnelers masquerading as system DLL namesQ3IOA-2Good Noisy on developer hosts, tuned via ContextBaseFileName
T1105Tool transfer into the observed staging directoriesQ4IOA-3Good Filename-independent, survives per-target renaming
T1588.001Known malware hashes presentQ5IOC importPartial MD5-only, and the actor recompiles per target
T1497.001Username-substring sandbox gatenonenoneGAP Static analysis only. Do not trust sandbox verdicts on this family
T1082 / T1057Host, network and process reconnaissanceQ10IOA-1Partial Depends on FileOpenInfo collection, backed by the SACL hunt
T1005NetSetup.log collectionQ10nonePartial See s7.5 for the independent SACL path
T1113Screenshot capturenoneIOA-1GAP No discrete screen-capture telemetry. Only reachable via the parent implant
T1071.001 / T1008HTTPS beacon to fixed URI paths, with fallback C2Q6, Q9IOC importPartial Domain and IP covered. The URI paths need proxy logs (s7.1)
T1102C2 fronted on Azure App ServiceQ7, Q8nonePartial Exact FQDNs are solid. The namespace itself cannot be detected on alone
T1573WebSocket over TLS, binary framingnonenoneGAP Needs TLS inspection (H-9) or proxy upgrade logging (s7.2)
T1090.001SOCKS5 relay, server-initiated tunnelsQ11nonePartial Behavioural and role-dependent. Human review required
T1046Internal scanning executed through the relayQ11nonePartial Same query, same caveat
T1187Negotiate/NTLM SSO replayed to the proxynonenoneGAP Proxy auth logs only (s7.3). Mitigated by H-5
T1041File exfiltration over the C2 channelnonenoneGAP Proxy URI hunt only (s7.1)
Mutex artefactsSingle-instance guards for NightLedger and ArcBridgenonenoneGAP No mutex event in the Falcon model. YARA memory scan only

Reading the gaps

Six of the eighteen rows are gaps, and they cluster in two places. The first cluster is network payload visibility: the URI paths, the WebSocket upgrade, the proxy authentication and the exfiltration are all inside TLS, so endpoint EDR structurally cannot see them. Those four gaps close together the moment proxy URI logging exists (s7.1 through s7.3) and close fully with TLS inspection (H-9). The second cluster is in-memory artefacts: mutexes, the sandbox gate and screenshot capture have no corresponding sensor event, and no amount of query engineering creates one. Those are YARA and memory-forensics problems, and this pack routes them there in s9 rather than pretending a CQL query covers them.

What is not a gap is the loading chain. Q1 through Q4 cover the side-load and both staging paths with high confidence and low noise, and they fire before the relay becomes useful. That is the coverage that matters most, and it is the reason the executive summary sends analysts there first.

All eleven queries passed the review-v2 quality pass. Field names were validated against the Falcon data model; the only tenant-dependent element is FileOpenInfo in Q10, which is flagged in-query. No query carries an in-query time filter, so none can fail to parse on line 1. Every query rated FP medium or higher carries a // TUNING: exclusion inside the query block, so the guidance travels with the query when an analyst copies it into Falcon. Validation gates are in s11; run gate 1 before you trust any negative result from this pack.

16

Hunt Summary Ticket

TITLE:      Hunt: Nimbus Manticore (Mirage Kitten / UNC1549): NightLedger backdoor
            and the BridgeHead / ArcBridge relay tunnelers

SEVERITY:   Critical. Iranian state-aligned espionage, active as of 2026-07-28

SCOPE:      All Windows endpoints. Prioritise staff in aerospace, aviation, defence,
            telecom, government and finance functions, and anyone who has been
            approached about a job opportunity in the last 90 days.
            Lookback: 90 days for indicators, 30 days for behavioural queries.

HYPOTHESIS: An endpoint is running NightLedger via a relocated AppVShNotify.exe
            side-loading a fake SspiCli.dll, and/or is hosting a BridgeHead or
            ArcBridge WebSocket tunneler that has turned the host into a covert
            SOCKS5 relay whose internal traffic is attributed to a legitimate user.

QUERIES:    Q1  AppVShNotify.exe outside its install tree          CONF high  FP low
            Q2  SspiCli.dll written outside system directories     CONF high  FP low
            Q3  Tunneler DLL basenames outside system directories  CONF high  FP med
            Q4  PE written to the BridgeHead staging directories   CONF high  FP low
            Q5  Published MD5 hashes                               CONF high  FP low
            Q6  DNS: non-Azure C2 domains                          CONF high  FP low
            Q7  DNS: Azure-hosted C2 FQDNs                         CONF high  FP low
            Q8  DNS: azurewebsites.net from non-browsers           CONF med   FP high
            Q9  Connections to the campaign C2 IP                  CONF high  FP low
            Q10 NetSetup.log read outside the join toolchain       CONF med   FP med
            Q11 Internal TCP fan-out (relay behaviour)             CONF med   FP med

DO FIRST:   1. Run Q1, Q2 and Q4 over 30 days. These are the highest-signal,
               lowest-noise queries in the pack and they fire before the relay works.
            2. Run Q5, Q6, Q7 and Q9 over 90 days for the historical answer.
            3. Confirm gate 1 in s11 before trusting any null result, especially
               that %LocalAppData% is not excluded from file-write monitoring.
            4. Import the s10 CSV into Falcon IOC Management.
            5. Search proxy logs for the three NightLedger URI paths (s7.1).

FINDINGS:   [ ] Q1-Q4 loader artefacts   hosts: ______
            [ ] Q5 hash matches          hosts: ______
            [ ] Q6/Q7/Q9 C2 contact      hosts: ______
            [ ] Q10 NetSetup.log access  hosts: ______
            [ ] Q11 relay fan-out        hosts: ______
            [ ] Proxy URI path hits      hosts: ______

GAPS:       Mutex artefacts have no Falcon event and need YARA memory scanning.
            NightLedger URI paths, the GET /connect upgrade, proxy SSO abuse and
            exfiltration are all inside TLS and need proxy URI logging or inspection.
            The username-substring sandbox gate means live samples will not detonate
            in a lab, so sandbox verdicts on this family are not evidence of safety.
            Hashes are MD5 only and the actor recompiles per target.

ACTIONS:    Immediate  H-1 DLL search order, H-2 delivery-path ASR,
                       H-3 MOTW and archive controls, H-4 force proxy egress
            Near term  H-5 restrict outbound NTLM, H-6 audit NetSetup.log,
                       H-7 workstation segmentation, H-8 DLL application control
            Strategic  H-9 TLS inspection, H-10 VPN client footprint,
                       H-11 recruitment-lure awareness for targeted functions

OWNER:      ______________________          DUE: ______________

VERSION:    v0.1 · 2026-07-29 · HuntPack
17

Changelog

v0.12026-07-29Initial pack. Built from the Kaspersky GReAT disclosure of 2026-07-28 plus two corroborating secondary sources. 11 CQL hunt queries, 3 Custom IOA recommendations, 32 atomic indicators (10 MD5, 21 domains, 1 IPv4), 7 native audit-log hunts, 11 tiered hardening controls and 5 deployable playbooks. All atomic indicators traced to saved source snapshots. Coverage gaps documented in s15 rather than papered over: mutex artefacts, in-TLS network payload, and the username-substring sandbox gate.
18

References

TierSourceUsed forAccessed
1 · PrimaryKaspersky Securelist (GReAT), "Mirage Kitten targets Middle East and Africa region with new malware", 2026-07-28Every atomic indicator, the side-load chain, mutexes, the NightLedger command table, both tunneler wire protocols, victimology2026-07-29
2 · SecondaryThe Hacker News, "Nimbus Manticore Deploys NightLedger and Turns Victim Systems Into Covert Relays", 2026-07-28Alias set, relay-node framing, recruitment-lure delivery description2026-07-29
2 · SecondaryTechNadu, "Mirage Kitten's New Malware Toolkit Targets Aerospace and Defense Across Middle East and Africa", 2026-07-28TA455 alias, sector-targeting framing2026-07-29
FrameworkMITRE ATT&CK EnterpriseTechnique and mitigation mapping in s6 and s122026-07-29
VendorMicrosoft, Attack Surface Reduction rules referenceASR rule GUIDs in H-2, H-3 and playbook P22026-07-29
VendorMicrosoft, Dynamic-Link Library SecuritySafeDllSearchMode and CWDIllegalInDllSearch in H-1 and playbook P12026-07-29
BenchmarkCIS Microsoft Windows BenchmarksSession Manager and Network Security baseline settings in H-1, H-5 and H-82026-07-29
ReferenceCrowdStrike Falcon LogScale query language documentationCQL syntax validation for all 11 queries in s82026-07-29

Source snapshots. The fetched plain text of all three intelligence sources is preserved alongside this file in NimbusManticore-NightLedger-Hunt-sources/. Every atomic indicator in s4 and s10 is traceable verbatim to those snapshots. All three pages were checked for text directed at an automated agent; none was found, and no source was dropped.