Nimbus Manticore: NightLedger backdoor and the BridgeHead / ArcBridge relay tunnelers
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.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| 1 · Primary | Kaspersky Securelist (GReAT), 2026-07-28 | Full 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 · Secondary | The Hacker News, 2026-07-28 | Alias 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 · Secondary | TechNadu, 2026-07-28 | Adds 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.
Hunt Brief & Attack Chain
Attack chain
| # | Step | Detail | Telemetry | Hunt angle |
|---|---|---|---|---|
| 1 | Initial access | Recruitment-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, MOTW | Archive downloads from file-sharing hosts followed by execution from the download directory |
| 2 | Execution via side-load | Malicious 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, PeFileWritten | Q1, Q2. AppVShNotify outside its install tree, SspiCli.dll written outside system directories |
| 3 | Single-instance guard | NightLedger creates mutex A8215357-F99A-44FE-BC65-D8F0434B0C03; ArcBridge creates F56E68DA-4A89-46B4-9AC8-7290A7651000. Exits if already present. | Memory / YARA, Custom IOA | GAP No mutex telemetry in the standard Falcon event model. See s9 and s7 |
| 4 | C2 beacon | NightLedger polls realhealthshop[.]com over HTTPS at URI /edfcvfgbhnjmkqwasderfgg, falling back to tjconsultingservices[.]com. Responses are tokenised on the delimiter (#%%#) and dispatched. | DnsRequest, proxy logs | Q6 plus proxy URI hunt in s7 |
| 5 | Collection | 16 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, ProcessRollup2 | Q10. NetSetup.log read by a non-system process |
| 6 | Exfiltration | Command output posted to /wsdefvvbnhyuijkplmbgfrtt; file upload posted to /qasxcdfvgbhnmyuioplkhnj. | Proxy logs, TLS metadata | Proxy URI hunt in s7. Not visible to endpoint EDR alone |
| 7 | Tunneler deployment | BridgeHead 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, NewExecutableWritten | Q3, Q4. Highest-value low-noise signal in the pack |
| 8 | Execution gating | Resolves GetUserNameA from advapi32.dll, lowercases the username, and requires a hardcoded substring (3 characters in one observed variant). Silent exit on mismatch. | Static analysis only | GAP Anti-sandbox. Defeats generic detonation, so do not rely on sandbox verdicts |
| 9 | Tunnel establishment | GET /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, DnsRequest | Q7, Q8 plus the s7 proxy hunt for a stale UA on a WebSocket upgrade |
| 10 | Relay operation | Server-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. | NetworkConnectIP4 | Q11. Internal TCP fan-out from a single process on one workstation |
| 11 | Second tunneler | ArcBridge 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, YARA | Q5, Q6 plus the config-block YARA idea in s9 |
Hunt hypotheses, ordered by fidelity
| # | Hypothesis | MITRE | Falcon events | Expected FP | Conf |
|---|---|---|---|---|---|
| H1 | A legitimate AppVShNotify.exe is executing from a directory outside the App-V / Office install tree, indicating a relocated side-load host. | T1574.001, T1574.002 | ProcessRollup2 | Very low. Software packagers occasionally stage App-V binaries. | HIGH |
| H2 | A file named SspiCli.dll is written anywhere other than the Windows system DLL directories. | T1574.001, T1036.005 | PeFileWritten | Very low. Servicing and WinSxS writes are excluded by path. | HIGH |
| H3 | An executable file is written into %LocalAppData%\Microsoft\VisualStudio or a univpn\promote directory, the two observed BridgeHead staging paths. | T1105, T1574.001 | PeFileWritten, NewExecutableWritten | Low. Visual Studio extension installs touch the parent tree. | HIGH |
| H4 | One of the published NightLedger / BridgeHead / ArcBridge MD5 hashes appears on an endpoint. | T1588.001 | ProcessRollup2, PeFileWritten | None. | HIGH |
| H5 | A host resolves one of the campaign's non-Azure C2 domains. | T1071.001, T1568 | DnsRequest | None for these specific FQDNs. | HIGH |
| H6 | A tunneler DLL basename (unbcl.dll, libwinpthread-1.dll, IPHLPAPI.dll) is written outside a legitimate install tree. | T1036.005, T1105 | PeFileWritten | Medium. libwinpthread-1.dll is a genuine MinGW runtime shipped by many open-source apps; IPHLPAPI.dll is a real Windows DLL. | MEDIUM |
| H7 | A non-browser process resolves an azurewebsites.net hostname, consistent with tunneler C2 hiding in legitimate Azure App Service traffic. | T1090, T1102 | DnsRequest | High. Line-of-business apps and installers legitimately call App Service endpoints. | MEDIUM |
| H8 | C:\Windows\debug\NetSetup.log is opened by a process that is not part of the domain-join or diagnostics tooling. | T1005, T1082 | FileOpenInfo | Medium. Support tooling and inventory agents read it. | MEDIUM |
| H9 | A 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, T1046 | NetworkConnectIP4 | Medium. Vulnerability scanners, monitoring agents and admin jump boxes look identical. | MEDIUM |
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.
| Type | Value | Conf | Action | Context | Expiry |
|---|---|---|---|---|---|
| md5 | A239E655709A2518DD0B7BDBED163679 | high | detect | NightLedger backdoor, sspicli.dll | 2027-01-29 |
| md5 | 5FA15EF96808EA82F0A6176F0BB4B386 | high | detect | ArcBridge tunneler | 2027-01-29 |
| md5 | 42F847597109DA2A220391BB09D00676 | high | detect | ArcBridge tunneler | 2027-01-29 |
| md5 | AFB1C1583606599C7272CFB33CC6F498 | high | detect | ArcBridge tunneler | 2027-01-29 |
| md5 | 6038D42AF0AFFD1FB263F470C0956F6B | high | detect | BridgeHead, unbcl.dll | 2027-01-29 |
| md5 | AE628EFA305387B633DCE82F9364875B | high | detect | BridgeHead, unbcl.dll | 2027-01-29 |
| md5 | F7D36CC5904A53252D2BB3D21615134F | high | detect | BridgeHead, libwinpthread-1.dll | 2027-01-29 |
| md5 | C90F0EFADBF322E5EB1C4103A38C30E6 | high | detect | BridgeHead, libwinpthread-1.dll | 2027-01-29 |
| md5 | D09B14A2FE01C7363ECC56F5D046162C | high | detect | BridgeHead, IPHLPAPI.dll | 2027-01-29 |
| md5 | C832ECD135781B11F59E3FFFB3D2B6AC | high | detect | BridgeHead variant using WSS/443 to businessmixture[.]com/blog instead of Azure | 2027-01-29 |
| domain | realhealthshop[.]com | high | detect | NightLedger primary C2, URI /edfcvfgbhnjmkqwasderfgg | 2026-10-29 |
| domain | tjconsultingservices[.]com | high | detect | NightLedger fallback C2 | 2026-10-29 |
| domain | aecert[.]org | high | detect | ArcBridge C2, port 443 | 2026-10-29 |
| domain | smartconnect[.]azurewebsites[.]net | high | detect | BridgeHead C2, WebSocket GET /connect | 2026-10-29 |
| domain | businessmixture[.]com | high | detect | BridgeHead variant C2 over WSS/443 | 2026-10-29 |
| domain | global-reds[.]com | high | hunt | Campaign infrastructure | 2026-10-29 |
| domain | maadinglobal[.]com | high | hunt | Campaign infrastructure | 2026-10-29 |
| domain | business-deegital[.]com | high | hunt | Campaign infrastructure, typosquat pattern | 2026-10-29 |
| domain | business-deegital[.]azurewebsites[.]net | high | hunt | Azure App Service C2 host | 2026-10-29 |
| domain | businessdeegital[.]azurewebsites[.]net | high | hunt | Azure App Service C2 host | 2026-10-29 |
| domain | neexportfolio[.]com | high | hunt | Campaign infrastructure | 2026-10-29 |
| domain | neexportfolio[.]azurewebsites[.]net | high | hunt | Azure App Service C2 host | 2026-10-29 |
| domain | neexportfolio[.]eastus[.]cloudapp[.]azure[.]com | high | hunt | Azure cloudapp C2 host | 2026-10-29 |
| domain | toadreport[.]azurewebsites[.]net | high | hunt | Azure App Service C2 host | 2026-10-29 |
| domain | healthcarezoom-centeral[.]azurewebsites[.]net | high | hunt | Azure App Service C2 host, videoconference-lure naming | 2026-10-29 |
| domain | healthcarezoomcenteral[.]azurewebsites[.]net | high | hunt | Azure App Service C2 host, videoconference-lure naming | 2026-10-29 |
| domain | healthcarezoomcenteral[.]org | high | hunt | Campaign infrastructure, videoconference-lure naming | 2026-10-29 |
| domain | thehealth-life[.]com | high | hunt | Campaign infrastructure | 2026-10-29 |
| domain | buisness-centeral-transportation[.]com | high | hunt | Campaign infrastructure, misspelling pattern | 2026-10-29 |
| domain | business-startup[.]azurewebsites[.]net | high | hunt | Azure App Service C2 host | 2026-10-29 |
| domain | businessstartup[.]azurewebsites[.]net | high | hunt | Azure App Service C2 host | 2026-10-29 |
| ipv4 | 172[.]86[.]98[.]113 | medium | hunt | Campaign infrastructure. Confirm it is not shared hosting before promoting to block | 2026-10-29 |
Non-atomic indicators (behavioural, no expiry)
| Type | Value | Context |
|---|---|---|
| mutex | A8215357-F99A-44FE-BC65-D8F0434B0C03 | NightLedger single-instance guard |
| mutex | F56E68DA-4A89-46B4-9AC8-7290A7651000 | ArcBridge single-instance guard |
| config id | 4B8CC395-A26F-41F1-A1DC-8B993D9D41D2 | ArcBridge embedded implant identifier, between the <<STARTXX>> and <<ENDXX>> markers |
| uri | /edfcvfgbhnjmkqwasderfgg | NightLedger tasking GET |
| uri | /wsdefvvbnhyuijkplmbgfrtt | NightLedger command-output POST |
| uri | /qasxcdfvgbhnmyuioplkhnj | NightLedger file-upload POST |
| uri | /connect | BridgeHead WebSocket upgrade path |
| delimiter | (#%%#) | NightLedger C2 field separator |
| filename | SspiCli.dll beside AppVShNotify.exe | NightLedger side-load pair |
| path | %LocalAppData%\Microsoft\VisualStudio | BridgeHead staging directory (Egypt) |
| path | C:\program files (x86)\univpn\promote\ | BridgeHead staging directory (Pakistan) |
| user agent | Chrome 86 / Edg 86 string, hardcoded | BridgeHead WebSocket upgrade. See the full string in s7 |
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Windows workstations (engineering, HR, recruitment-facing staff) | Falcon sensor: ProcessRollup2, PeFileWritten, NewExecutableWritten | CRITICAL | Low. Default sensor coverage. |
| Endpoint file-read visibility | FileOpenInfo on C:\Windows\debug\NetSetup.log | MEDIUM | High. File-open telemetry is configuration and licence dependent. Back it with a filesystem SACL (s7). |
| DNS resolution | DnsRequest, plus DNS server analytic logs for hosts without the sensor | HIGH | Low on managed endpoints. High for BYOD, contractors and unmanaged lab hosts. |
| Outbound HTTPS / proxy | Proxy or TLS-inspecting gateway logs with URI, Host header and User-Agent | HIGH | High. Without URI visibility the NightLedger endpoints and the GET /connect upgrade are invisible. Endpoint EDR alone cannot see them. |
| East-west network flow | NetworkConnectIP4, or NetFlow / internal firewall logs | HIGH | Medium. Relay traffic is the payoff stage and is only visible if internal connections are logged. |
| Enterprise proxy authentication | Proxy auth logs showing Negotiate / NTLM SSO from non-browser user agents | MEDIUM | Medium. Many proxies do not retain the auth scheme per request. |
| Mail gateway | Recruitment-lure detonation, archive attachment and file-sharing link telemetry | MEDIUM | Medium. Lures arrive via links to third-party file-sharing services rather than attachments. |
| Memory / mutex artefacts | Custom IOA, YARA memory scan | MEDIUM | High. No mutex event exists in the standard Falcon model. Covered only by IOA and YARA. |
| VPN client program directories | PeFileWritten under third-party VPN install paths | HIGH | Low, 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.
ATT&CK Mapping
| Tactic | Technique | Observed behaviour | Query or control |
|---|---|---|---|
| Initial Access | T1566.002 Spearphishing Link | Recruitment and videoconference lures linking to archives on file-sharing services | s7 mail gateway hunt, H-2 hardening |
| Execution | T1204.002 User Execution: Malicious File | Victim opens the downloaded archive and runs the bundled loader | H-1, H-3 hardening |
| Persistence / Priv Esc / Defense Evasion | T1574.001 Hijack Execution Flow: DLL | SspiCli.dll side-loaded via AppVShNotify.exe and the RPCRT4.dll delay-load path | Q1, Q2, IOA-1, H-1 |
| Defense Evasion | T1036.005 Masquerading: Match Legitimate Name | Implants named SspiCli.dll, unbcl.dll, libwinpthread-1.dll, IPHLPAPI.dll | Q2, Q3, IOA-2 |
| Defense Evasion | T1497.001 Virtualisation / Sandbox Evasion: System Checks | Username substring gate via GetUserNameA, silent exit on mismatch | GAP Static analysis only |
| Discovery | T1082 System Information Discovery | Commands 1 and 25: user, host and network identity collection | Q10 |
| Discovery | T1057 Process Discovery | Command 90: process listing, returned with NetSetup.log | Q10 |
| Discovery | T1083 File and Directory Discovery | Commands 17 and 75: directory listing and logical drive enumeration | IOA-1 |
| Collection | T1113 Screen Capture | Command 36: screenshot capture | IOA-1 |
| Collection | T1005 Data from Local System | Command 93: collection of C:\Windows\debug\NetSetup.log | Q10, H-6 hardening |
| Command and Control | T1071.001 Application Layer Protocol: Web | HTTPS GET/POST beaconing to fixed high-entropy URI paths | Q6, s7 proxy hunt |
| Command and Control | T1102 Web Service | C2 fronted on Azure App Service (azurewebsites.net) and Azure cloudapp hosts | Q7, Q8 |
| Command and Control | T1090.001 Internal Proxy | BridgeHead and ArcBridge SOCKS5 relay, server-initiated tunnels | Q11, IOA-3 |
| Command and Control | T1573 Encrypted Channel | WebSocket over TLS 443, binary framing inside the upgrade | s7 proxy hunt, H-4 hardening |
| Command and Control | T1008 Fallback Channels | tjconsultingservices[.]com as NightLedger fallback C2 | Q6 |
| Credential Access | T1187 Forced Authentication | HTTP 407 handling that replays the user's Negotiate / NTLM SSO context to the proxy | H-5 hardening, s7 proxy auth hunt |
| Lateral Movement | T1046 Network Service Discovery | Operator-side scanning executed through the relay, sourced from the victim host | Q11 |
| Exfiltration | T1041 Exfiltration Over C2 Channel | File upload POST to /qasxcdfvgbhnmyuioplkhnj | s7 proxy hunt |
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.
CrowdStrike LogScale CQL Hunt Queries
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.
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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.
| IOA | Rule type | Pattern | Exclusions | Action |
|---|---|---|---|---|
| IOA-1 Relocated App-V notifier | Process Creation | Image filename matches AppVShNotify\.exe and the grandparent path is outside the Office and App-V install trees | Software packaging and App-V sequencing hosts, excluded by host group not by path | Detect, then Prevent after one week clean |
| IOA-2 System DLL name in a user-writable path | File Creation | File 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 only | Prevent. 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-installer | File Creation | PE 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 updater | The vendor's signed installer and update service | Detect. Promote to Prevent once the vendor's own update pattern is baselined |
Not suitable as an IOA
- Mutex names.
A8215357-F99A-44FE-BC65-D8F0434B0C03andF56E68DA-4A89-46B4-9AC8-7290A7651000are 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 identifier4B8CC395-A26F-41F1-A1DC-8B993D9D41D2make 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
| Field | Value |
|---|---|
| Scheduled Search name | DETECT: NightLedger side-load host (Nimbus Manticore) |
| Description | Fires 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. |
| Schedule | Q1, 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 body | A 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)
- 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.
- 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.
- Pull the full directory listing of the path where
AppVShNotify.exeran. Look for a co-locatedSspiCli.dll. Hash it and compare against the s10 MD5 list. - 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.
- 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.
- Check the host's outbound proxy log for the three NightLedger URI paths and for a
GET /connectWebSocket upgrade (s7.1, s7.2). - 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.
- 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$/ito 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
ContextBaseFileNamefrom a Q2 or Q3 hit and search fleet-wide for every other file that process has written. That is the dropper's full inventory.
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.
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
# 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
# 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
# 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
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.
| Gate | What to prove | How | Pass criteria |
|---|---|---|---|
| 1 · Telemetry ready | The 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 baseline | The 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 test | The 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 · Promotion | The 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.
Hardening: Tiered
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.
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.
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.
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'
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.
| Phase | Actions | Owner | Evidence 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 L1 | The 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 lead | Full 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 team | Every 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 team | The 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 team | Account 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 + SOC | Block-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 team | Rebuild 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 + platform | Hardening 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 + legal | Timeline, scope statement, and the indicator set shared externally |
Detection Coverage Map
| Technique | Behaviour | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1566.002 | Recruitment-lure spearphishing link to a file-sharing archive | none | none | GAP Mail gateway only (s7.7). Endpoint telemetry starts after the download |
| T1204.002 | User runs the archived loader | Q4 | IOA-3 | Partial Caught at the write, not at the click |
| T1574.001 | SspiCli.dll side-load via AppVShNotify.exe | Q1, Q2 | IOA-1, IOA-2 | Good Both the loader host and the payload write are covered |
| T1036.005 | Tunnelers masquerading as system DLL names | Q3 | IOA-2 | Good Noisy on developer hosts, tuned via ContextBaseFileName |
| T1105 | Tool transfer into the observed staging directories | Q4 | IOA-3 | Good Filename-independent, survives per-target renaming |
| T1588.001 | Known malware hashes present | Q5 | IOC import | Partial MD5-only, and the actor recompiles per target |
| T1497.001 | Username-substring sandbox gate | none | none | GAP Static analysis only. Do not trust sandbox verdicts on this family |
| T1082 / T1057 | Host, network and process reconnaissance | Q10 | IOA-1 | Partial Depends on FileOpenInfo collection, backed by the SACL hunt |
| T1005 | NetSetup.log collection | Q10 | none | Partial See s7.5 for the independent SACL path |
| T1113 | Screenshot capture | none | IOA-1 | GAP No discrete screen-capture telemetry. Only reachable via the parent implant |
| T1071.001 / T1008 | HTTPS beacon to fixed URI paths, with fallback C2 | Q6, Q9 | IOC import | Partial Domain and IP covered. The URI paths need proxy logs (s7.1) |
| T1102 | C2 fronted on Azure App Service | Q7, Q8 | none | Partial Exact FQDNs are solid. The namespace itself cannot be detected on alone |
| T1573 | WebSocket over TLS, binary framing | none | none | GAP Needs TLS inspection (H-9) or proxy upgrade logging (s7.2) |
| T1090.001 | SOCKS5 relay, server-initiated tunnels | Q11 | none | Partial Behavioural and role-dependent. Human review required |
| T1046 | Internal scanning executed through the relay | Q11 | none | Partial Same query, same caveat |
| T1187 | Negotiate/NTLM SSO replayed to the proxy | none | none | GAP Proxy auth logs only (s7.3). Mitigated by H-5 |
| T1041 | File exfiltration over the C2 channel | none | none | GAP Proxy URI hunt only (s7.1) |
| Mutex artefacts | Single-instance guards for NightLedger and ArcBridge | none | none | GAP 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.
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
Changelog
References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| 1 · Primary | Kaspersky Securelist (GReAT), "Mirage Kitten targets Middle East and Africa region with new malware", 2026-07-28 | Every atomic indicator, the side-load chain, mutexes, the NightLedger command table, both tunneler wire protocols, victimology | 2026-07-29 |
| 2 · Secondary | The Hacker News, "Nimbus Manticore Deploys NightLedger and Turns Victim Systems Into Covert Relays", 2026-07-28 | Alias set, relay-node framing, recruitment-lure delivery description | 2026-07-29 |
| 2 · Secondary | TechNadu, "Mirage Kitten's New Malware Toolkit Targets Aerospace and Defense Across Middle East and Africa", 2026-07-28 | TA455 alias, sector-targeting framing | 2026-07-29 |
| Framework | MITRE ATT&CK Enterprise | Technique and mitigation mapping in s6 and s12 | 2026-07-29 |
| Vendor | Microsoft, Attack Surface Reduction rules reference | ASR rule GUIDs in H-2, H-3 and playbook P2 | 2026-07-29 |
| Vendor | Microsoft, Dynamic-Link Library Security | SafeDllSearchMode and CWDIllegalInDllSearch in H-1 and playbook P1 | 2026-07-29 |
| Benchmark | CIS Microsoft Windows Benchmarks | Session Manager and Network Security baseline settings in H-1, H-5 and H-8 | 2026-07-29 |
| Reference | CrowdStrike Falcon LogScale query language documentation | CQL syntax validation for all 11 queries in s8 | 2026-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.